簡體   English   中英

Symfony2中的條件關系

[英]Conditional Relationship in Symfony2

假設我有一個Post實體和一個Comment實體。 管理員可以批准或不批准評論(這是數據庫中的標志)。 郵政實體有:

/**
 * @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
 */
protected $comments;

而且我還想要第二個屬性,它看起來像:

/**
 * @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
 */
protected $approvedComments;

如何在此處僅加載已批准的評論?

這不能通過您描述的關系來實現。 由於關系基於主鍵,因此2個表不能“有條件地”相關。

你至少有解決方案

  1. 保留帶有注釋的實體上的“注釋”字段,從批准的注釋字段中刪除注釋,因為它與ORM所理解的注釋相同。 然后你會有 - > getComments()函數來獲取所有注釋,你可以在你的repostitory類中添加一個函數“getApprovedCommentsForPost($ post)”來檢索那些已批准的注釋。
  2. 您可以區分具有單一繼承的注釋,因此您可以在一個表中使用Comment類和ApprovedComment類,然后您可以在您的實體上創建2個關系(請在此處閱讀doctrine-orm.readthedocs.org/en/latest/參考/繼承-mapping.html#單表繼承)
  3. 從Comments存儲庫中檢索數據時,您可以使用doctrine過濾器默認過濾掉未批准的注釋

想法#1

您可以使用Inheritance mappinghttp//doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

這個想法將為每種類型(已批准和未批准)提供單獨的類,但將所有內容存儲在單個表中( SINGLE_TABLE繼承)。

您需要有額外的列來存儲類類型鑒別器。

然后,你會有:

/**
 * @ORM\OneToMany(targetEntity="ApprovedComment", mappedBy="post")
 */
protected $approvedComments;

/**
 * @ORM\OneToMany(targetEntity="NonApprovedComment", mappedBy="post")
 */
protected $nonApprovedComments;

明顯的缺點是創建額外的類。

想法#2

你可以調整一下Query / QueryBuilder如:

`SELECT p, c FROM AcmeDemoBundle:Post p LEFT JOIN p.comments c WITH c.approved = FALSE`

這個想法似乎更合理。

您無法在實體中定義該約束。 以下是相關文檔:

http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-onetomany

如您所見,沒有與條件相關的選項。 您必須使用QueryBuilder定義此條件。

暫無
暫無

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

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