[英]How to find a given value in a many-to-many relationship using Doctrine?
我有一个实体“讨论”,该讨论有(除其他事项外):
我试图选择属于特定类别(其类别属性是该类别)或此特定类别中推荐的所有讨论。
我可以轻松获得该类别中的所有讨论,例如:
$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.