Symfony主义加入一对多关系 [英] Symfony Doctrine joining a one to many relationship
问题描述
我想将两个表连接在一起,以便一次搜索即可检索所有实体.我有一对多的关系:绝地和成员.一个成员组可以有许多绝地武士.我想制作一个表单以按一个实体进行搜索,并整体显示所有信息.
I want to join two tables together to get retrieve all the entities in one search. I have a one to many relationship: Jedi and Member. One member group can have many Jedi's. I want to make a form to search by one entity and displays all of the information as a whole.
示例:按指定的颜色搜索Jedi->检索姓名,年龄,性别,颜色和等级.
Example: Search for a Jedi by its assigned color -> retrieving name, age, gender, color, and rank.
Jedi.php:
class Jedi
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var integer
*
* @ORM\Column(name="age", type="integer")
*/
private $age;
/**
* @var string
*
* @ORM\Column(name="gender", type="string", length=255)
*/
private $gender;
/**
*
* @ORM\ManyToOne(targetEntity="Member", inversedBy="jedi")
* @ORM\JoinColumn(name="member", referencedColumnName="id")
*/
private $member;
Member.php:
Member.php:
class Member
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="rank", type="string", length=255)
*/
private $rank;
/**
* @var string
*
* @ORM\Column(name="color", type="string", length=255)
*/
private $color;
/**
* @var integer
* @ORM\OneToMany(targetEntity="Jedi", mappedBy="member")
*
*/
protected $jedi;
在我的JediRepository.php中:
In my JediRepository.php:
class JediRepository extends EntityRepository
{
public function findJediByColor($color) {
$query = $this->getEntityManager()
->createQuery(
'SELECT color, rank
FROM YodaBundle:Member member
JOIN member.jedi
WHERE member.color = :color'
)->setParameter('color', $color);
try {
return $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
}
现在,我非常确定我可能有错误的查询联接语句,并且我对如何继续使用它感到很困惑.任何帮助将不胜感激!
Now I am pretty sure I probably have the query join statement all wrong and I'm quite confused on how to to go about using it. Any help would be appreciated!
推荐答案
您不必创建特定请求即可执行此类操作. 可以简单地完成:
You have not to create specifics requests to do things like this. It could be done simply :
Using Eager loading in your oneToMany entity definition.
/**
* @var integer
* @ORM\OneToMany(targetEntity="Jedi", mappedBy="member",fetch="EAGER")
*
*/
protected $jedi;
在Jedi存储库中删除您的public function findJediByColor($color) {
使用魔术函数直接在您的控制器中存储库,例如:
Using magic function repository in your controller directly like :
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findByColour($colour);
或
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findByRank($rank);
或
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findByJedi($jedi);
或具有多个条件
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findBy(array('colour' => $colour, 'rank' => $rank));
这篇关于Symfony主义加入一对多关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!