簡體   English   中英

如何使用Doctrine在多對多關系中找到給定值?

[英]How to find a given value in a many-to-many relationship using Doctrine?

我有一個實體“討論”,該討論有(除其他事項外):

  • 類別屬性(每個討論都有一個關聯的類別)
  • “推薦類別”的ManyToMany關聯(可以在多個類別中推薦每次討論)

我試圖選擇屬於特定類別(其類別屬性是該類別)或此特定類別中推薦的所有討論。

我可以輕松獲得該類別中的所有討論,例如:

 $qb = self::$em->getRepository('Discussion')->createQueryBuilder('d');
 $discussions = $qb->where('d.category='.$current_category_id)
 ->setFirstResult( $offset )
 ->setMaxResults( $limit )          
 ->getQuery()->getResult();

我需要補充的是,所有在“ recommended_categories”列表中包含“ current_category_id”的討論。

因此添加如下內容:

$qb = self::$em->getRepository('Discussion')->createQueryBuilder('d');
$discussions = $qb->where('d.category='.$current_category_id)

  ->orWhere($qb->expr()->in($current_category_id, 'd.recommended_categories'))

 ->setFirstResult( $offset )
 ->setMaxResults( $limit )          
 ->getQuery()->getResult();

由於它不喜歡SQL中的“ 4 IN(d.recommended_categories))”,因此產生了SQL錯誤。

這是在“討論”實體中的recommended_categories外觀:

/**
 * @ManyToMany(targetEntity="Category")
 * @JoinTable(name="discussion_recommended_categories",
 *   joinColumns={@JoinColumn(name="discussion_id", referencedColumnName="id")},
 *   inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id")}
 * )
 */
private $recommended_categories;

這是類別實體:

/** @Id @Column(type="integer") @GeneratedValue **/
protected $id;

/** @Column(type="string", unique=true, nullable=false,name="Name") **/
protected $name;

我也嘗試過使用exist(d.recommended_categories中是否存在$ current_category_id),但沒有任何效果。

有什么想法可以檢查給定值(而不是列)是否存在於與該實體相關聯的值列表中?

謝謝!

首先,您應該在where子句中為參數使用准備好的語句 ,以便防止sql注入。 另外,您需要傳遞當前的類別實體,Doctrine會通過查看您的映射神奇地從中提取ID。 假設您有$currentCategory可用。

$discussions = $qb
    ->where('d.category = :category')
    ->setParameter('category', $currentCategory);

您正在嘗試使用IN來檢查集合中的給定值,但這不是IN的意思。 您應該將其用於以下one of情況(作為多個條件的替代)。 即myfield = 1或myfield = 2或myfield = 3可以寫成myfield IN(1、2、3)。 我認為您語法錯誤,因為參數順序錯誤。

無論如何,要擺脫IN ,只需在orWhere和類別中的orWhere添加orWhere 總之,您應該最終得到這樣的結果..未經測試。

$discussions = $qb
    ->where('d.category = :category')
    ->leftJoin('d.recommended_categories', 'rc')
    ->orWhere('rc = :category')
    ->setParameter('category', $currentCategory);

暫無
暫無

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

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