[英]Symfony entity repository with many-to-many relationship
我有兩個實體product
和document
,它們通過與JOIN
表many-to-many
關系關聯。 我的產品實體如下所示,我的文檔實體當前沒有對該產品的引用。
/**
* @ORM\Entity
* @ORM\Table(name="product")
* @ORM\Entity(repositoryClass="\MyApp\CmsBundle\Repository\ProductRepository")
*/
class Product
{
// ...
/**
* @ManyToMany(targetEntity="Document")
* @JoinTable(name="products_documents",
* joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="document_id", referencedColumnName="id")}
* )
**/
protected $documents;
// ...
public function __construct()
{
$this->documents = new ArrayCollection();
}
public function addDocument(Document $document)
{
$this->documents[] = $document;
return $this;
}
public function removeDocument(Document $document)
{
$this->documents->removeElement($document);
}
public function getDocuments()
{
return $this->documents;
}
當我在網站的前端展示產品時,我也會列出它的文檔。 但是我需要能夠根據它們的屬性status
和privacy
它們過濾掉。
因此,我一直在嘗試創建一個實體存儲庫來處理這種邏輯,但是到目前為止我嘗試過的所有操作都失敗了。 我需要實現的是與此類似的查詢,但采用Symfony / Doctrine格式:
SELECT d.*
FROM documents d, products_documents pd,
WHERE pd.product_id = :product_id
AND pd.document_id = d.id,
AND d.status = 'PUBLISHED',
AND d.privacy = 'PUBLIC';
理想情況下,我希望能夠從控制器執行以下操作:
// get documents to display on front-end
$documents = $em->getRepository('MyAppCmsBundle:Product')->getDocumentsForProduct($product);
我已經調用了該函數,但我只是不知道如何檢索所需的數據。
更新
到目前為止,這是我在保持工作代碼的同時所獲得的,但是它不返回文檔而是返回所有產品。 我不確定如何添加條件以將其指定到所傳遞的產品中,或者返回文檔而不是產品。
ProductRepository.php
public function getDocumentsForProduct(Product $product, $authenticated = false)
{
$query = $this->createQueryBuilder('p')
->join('MyApp\CmsBundle\Entity\Document', 'd')
->where('d.status = :status')
->andWhere('d.privacy = :privacy')
->setParameters(array(
'status' => 'PUBLISHED',
'privacy' => 'PUBLIC',
))
->getQuery();
return $query->getResult();
}
如果希望它返回文檔,則應將其放在DocumentRepository中。
“ createQueryBuilder”方法自動選擇屬於存儲庫的類型的實體。 因此,就您而言,這就是產品。 如果將相同的代碼放入DocumentRepository中,則應獲取Document實體。
我不知道是否可以使用QueryBuilder更改此方法。 但是您可以像這樣使用DQL:
$this->getEntityManager()->createQuery('SELECT p FROM YourBundle:Document WHERE ...');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.