簡體   English   中英

在Doctrine 2中查詢實體

[英]Joining Entities on query in Doctrine 2

我正在嘗試在Doctrine 2中的一個高級查詢中加入兩個實體。我正在使用Zend Framework 2。

不幸的是,我現在很難找到正在做的事情。

這是我在ZF2中得到的:

  • 我已經構建了一個名為KryuuCategorizer的模塊,我將用它來對網站上的各種內容進行分類。
  • 它附加到一個名為categorize的事件,它將獲得一個實體類型

分類程序有2個實體:

Category
  var id
  var name
  var objects

Object
  var id
  var entityName
  var module
  var entityId
  var category

Category->objects由ManyToOne綁定到Object- Object->category

然后我需要手動將實體綁定到Object-> entityId,我想我應該能夠通過在Doctrine 2中使用join來做到這一點。但我不知道從哪里開始或如何抓住它。 我希望有人可以讓我開始並向我展示正確的方向,我查看了Doctrine文檔,但是比我應該更加困惑。

有幾種方法可以達到你想要的效果。

1.在關系定義中添加fetch="EAGER

為此,請在Object的實體定義中添加fetch="EAGER"

/** MANY-TO-ONE, OWNING SIDE
 * @var Category
 * @ORM\ManyToOne(targetEntity="Application\Entity\Category", inversedBy="objects", fetch="EAGER")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=true)
 */
protected $category;

此處此處的文檔中提到了急切加載。


2.Object存儲庫中編寫自定義DQL查詢並執行獲取連接:

/**
 * Find object using DQL with a category joined.
 *
 * @param int $id
 * @return Building|null
 */
public function findObject($id)
{
    $entityManager = $this->getEntityManager();
    $query = $entityManager->createQuery(
        "SELECT o, c FROM Object o JOIN o.category c WHERE o.id = :id"
    );
    $query->setParameter('id', $id);
    $query->getOneOrNullResult();
}

這些連接在此處的文檔中進行了解釋。 觀察fetch-join和常規聯接之間的區別。


3.或者在Object存儲庫中使用Doctrine QueryBuilder來獲得相同的結果:

/**
 * Find object using query builder with a category joined.
 *
 * @param int $id
 * @return Building|null
 */
public function findObject($id)
{
    $queryBuilder = $this->createQueryBuilder('o')
        ->addSelect('c')
        ->leftJoin('o.category', 'c')
    }
    return = $queryBuilder->getQuery()->getOneOrNullResult();
}

請注意,如果要獲取連接,還需要將addSelect條件添加到查詢中,否則它是常規連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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