[英]Doctrine join entities
查询与另一个实体有关系的实体时,我正在尝试进行一些有效的改进。
实体A:
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="name", type="string", length=225)
* @Assert\NotBlank(message="Please enter a name for your profile.")
*/
protected $display_name;
/**
* @ORM\OneToOne(targetEntity="Posts", mappedBy="profile", cascade={"all"}, fetch="LAZY")
*/
protected $posts;
实体B:
/**
* @var integer
* @ORM\Column(name="profile_id", type="integer")
* @ORM\Id
*/
protected $profile_id;
/**
* @ORM\OneToOne(targetEntity="Profile", inversedBy="posts")
* @ORM\JoinColumn(name="profile_id", referencedColumnName="id")
*/
protected $profile;
/**
* @var string
* @ORM\Column(name="content", type="string")
*/
protected $content;
当我计算要执行的查询的数量时,我得到两个,我猜想是说尽管每个实体都有关系,但是对于每个实体却运行两个单独的查询。
我目前正在像这样获取实体A:
public function fetchById($id)
{
return $this->createQueryBuilder('p')
->where('p.id = :id')
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult();
}
然后像这样调用实体B:
$profile = $profileRepository->fetchById($user->getUserId());
$lastpost = $profile->getPosts()[0];
但是我希望能够在此查询中加入第二个实体,这样我才可以调用一个查询,而不是两个。 我希望做这样的事情:
public function fetchById($id)
{
return $this->createQueryBuilder('p')
->select('p','pp')
->leftJoin(Posts::class, 'pp', \Doctrine\ORM\Query\Expr\Join::WITH, 'p.id = pp.profile_id')
->where('p.id = :id')
->setParameter('id', $id)
->getQuery()
->getResults();
}
但是,左联接返回两个实体的数组。 这不是我想要的,因为我仍然希望能够例如调用实体A中的getPosts()方法。
我本质上是想填充实体A,包括所有相关实体。 但是通过仅执行一个查询而不是两个查询,这在学说上可能吗?
前一段时间,我有一个类似的情况(不是1-1,而是1-n),我这样解决:
// ...Repository
public function findAllForUserWithAll(\AppBundle\Entity\User $u)
{
$query = $this->getEntityManager()->createQueryBuilder('ca1')
->add('select', 'c, s, i, m')
->add('from', 'AppBundle:Contact c')
->leftJoin('c.skills', 's')
->leftJoin('c.interests', 'i')
->leftJoin('c.metAt', 'm')
->where('c.user = :user')
->orderBy('c.lastname', 'ASC')
->setParameters([
'user' => $u,
])
->getQuery();
return $query->getResult();
}
这是在使用Doctrine ^ 2.4.8的Symfony 2.8。*中进行的-结果是一个查询带有3个联接(而不是4个查询)。 可能不是最好的代码,老实说,所有的魔力都是在引擎盖下发生的。 您的代码看起来也很相似。 但这可能是由于fetch="LAZY"
(在实体A上)所引起的-我的实体没有该实体?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.