0

我有一个实体“讨论”(除其他外):

  • 一个类别属性(每个讨论都有一个与之关联的类别)
  • “推荐类别”的多对多关联(每个讨论都可以在多个类别中推荐)

我正在尝试选择特定类别中的所有讨论(它们的类别属性是该类别)或在此特定类别中推荐的讨论。

我可以很容易地得到这个类别中的所有讨论,如下所示:

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

我需要添加所有在其推荐类别列表中具有 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 错误,因为它不喜欢 SQL 中的“4 IN(d.recommended_categories))”。

这是 Discussions 实体中的 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;

我也尝试过使用存在($current_category_id 是否存在于 d.recommended_categories 中),但没有任何效果。

有什么想法可以检查给定值(不是列)是否存在于与该实体关联的值列表中?

谢谢!

4

1 回答 1

3

首先,您应该为 where 子句中的参数使用准备好的语句,以防止 sql 注入。此外,您需要传入您当前的类别实体,Doctrine 将通过查看您的映射神奇地从中提取 id。假设你$currentCategory有空。

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

您正在尝试使用 aIN检查集合中的给定值,但这不是IN本意。您应该将它用于一个one of条件(作为几个或的替代品)。即 myfield = 1 OR myfield = 2 OR myfield = 3 你可以写成 myfield IN (1, 2, 3)。我认为你有一个语法错误,因为你的参数顺序错误。

无论如何摆脱 ,IN只需添加一个 join 到推荐orWhere的类别和类别上。总之,你应该最终得到这样的东西......未经测试。

$discussions = $qb
    ->where('d.category = :category')
    ->leftJoin('d.recommended_categories', 'rc')
    ->orWhere('rc = :category')
    ->setParameter('category', $currentCategory);
于 2013-09-15T15:40:16.773 回答