簡體   English   中英

原則加入實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM