如何使用querybuilder创建Symfony2表单中的字段,排除没有多对多关系的实体?

时间:2013-01-08 10:54:14

标签: php forms symfony doctrine-orm query-builder

在我的Symfony2应用程序中,人们可以编写将在网页上发布的文本。 可以选择编写新文本,您必须选择它所属的网页。

我想要实现的是,这个网页列表显示的网页还没有文字。否则,您将最终替换现有文本。

所以我想在我的表单类型 中写出类似 的内容:

$qb->select('wp')
->from('MyBundle:Webpage', 'wp')
->where('wp.webtexts is null')
->orderBy('wp.id');

问题出现在" wp.webtexts为null"声明。这是一个(完全正常的)多对多关系,我想测试这里是否没有关系。我收到的错误是:

  

[语义错误]第0行,第70行附近' webtexts为空':错误:   无效的PathExpression。 StateFieldPathExpression或   SingleValuedAssociationField预期。

如何查询与任何webtexts无关的网页?

加了:

我怎么能算出关系的数量?这种表示法:

 $qb->where($qb->expr()->count('wp.webtexts < 1'))

...给我:

  

[语法错误]第0行,第85行:错误:预期   Doctrine \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS,得到&#39;&lt;&#39;

2 个答案:

答案 0 :(得分:4)

如果您尝试检查webtexts对象,则应查询webtexts id字段而不是webtexts对象。 Doctrine仍在尝试在一天结束时编写SQL,而在SQL中你必须查询一个字段:

$qb->select('wp')
    ->from('MyBundle:Webpage', 'wp')
    ->leftJoin('wp.webtexts', 'wt')
    ->where('wt.id IS NULL')
    ->orderBy('wp.id');

答案 1 :(得分:1)

像这样:

$em->createQuery('SELECT wp FROM MyBundle:Webpage wp LEFT JOIN wp.webtexts wt WHERE wt.id IS NULL ORDER BY wp.id');

它需要与文本连接或不连接的网页,然后消除与文本有关系的网页...所以你有网页没有关系!