簡體   English   中英

具有多對多關系的Symfony實體存儲庫

[英]Symfony entity repository with many-to-many relationship

我有兩個實體productdocument ,它們通過與JOINmany-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;
    }

當我在網站的前端展示產品時,我也會列出它的文檔。 但是我需要能夠根據它們的屬性statusprivacy它們過濾掉。

因此,我一直在嘗試創建一個實體存儲庫來處理這種邏輯,但是到目前為止我嘗試過的所有操作都失敗了。 我需要實現的是與此類似的查詢,但采用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.

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