【问题标题】:doctrine query onetonmany / notIn with objects / symfony forms querybuilder学说查询 onetonmany / notIn 与对象 / symfony 形式 querybuilder
【发布时间】:2014-11-19 07:14:21
【问题描述】:

我正在使用 symfony 2 和教义在查询构建器的帮助下预过滤表单字段类型“实体”。

我的查询构建器应该返回用户尚未添加到列表中的所有产品。 所有的关系都是双向的。 我有链接到 userIngredients (oneToMany) 的产品,每个链接到一个用户 (manyToOne)

到目前为止,我已经有了这个,但它不起作用,我得到了其他用户没有添加的产品。

    return $this
        ->createQueryBuilder('p')
        ->leftJoin('p.userIngredients', 'i')
        ->where('i.user <> ?1')
        ->setParameter(1,$user);

1;有关如何纠正此问题的任何线索?

或者,我可以选择我不想要的产品,然后重新选择那些不匹配但使用表达式的产品,而 NotIn 似乎只适用于字符串

    $products = $this
        ->createQueryBuilder('p')
        ->leftJoin('p.userIngredients', 'i')
        ->where('i.user = ?1')
        ->setParameter(1,$user)
        ->getQuery()
        ->getResult();

    return $this
        ->createQueryBuilder('p')
        ->where($this->createQueryBuilder('p')->expr()->notIn('p', $products));

2;我们如何纠正它以使其与对象一起使用?

3;或者:有没有办法将结果数组而不是查询构建器传递给 symfony 表单构建器?

【问题讨论】:

  • 您最初的想法对我来说似乎完全合法,尽管我从未使用过&lt;&gt; 运算符,而是!=。您是否尝试过在分析器中验证 DQL
  • 这实际上是正常的,它不起作用:在检索产品 1 的用户成分时,我可能有另一个用户的用户成分。因此它不满足 where 子句。我需要一个条件来说明 $user 不属于每个 userIngredient->getUser... 组成的数组
  • 我认为第二个应该可以,但是您需要传递第一个 DQL 而不是整个结果对象。我的意思是$dql = $this-&gt;createQueryBuilder('p')-&gt;leftJoin('p.userIngredients', 'i')...-&gt;getQuery(); 然后是return $this-&gt;createQueryBuilder('p')...-&gt;expr()-&gt;notIn('p', $dql))-&gt;getQuery()-&gt;getResult();
  • 哇,我终于明白了,你为我指明了正确的方向!非常感谢。我将解决方案作为新答案发布。

标签: symfony doctrine-orm one-to-many where-clause query-builder


【解决方案1】:

感谢 Javad,我得到了思考: (稍作修改,我用的是数组结果,不是dql):

$qb = $this->_em->createQueryBuilder();

$ids = $qb
    ->select('p.id')
    ->from('AppBundle:MarketPlace\Product','p','p.id')
    ->leftJoin('p.userIngredients', 'i')
    ->where('i.user = ?1')
    ->setParameter(1,$user)
    ->getQuery()
    ->getResult();

//I don't know why I couldn't directly get an array of ids otherwise... if you know how to do better directly from the query, I'm interested (getScalarResult does not make it)
$ids=array_keys($ids);

$result = $this
    ->createQueryBuilder('p')
    ->where($this->createQueryBuilder('p')->expr()->notIn('p.id', $ids));

return $result;

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多