【问题标题】:Doctrine2 Selecting entity objects with no associated objectsDoctrine2 选择没有关联对象的实体对象
【发布时间】:2012-12-13 22:39:58
【问题描述】:

虽然这应该是相当简单的事情,但我似乎无法弄清楚。

我有图像实体和文章实体。许多文章可以使用同一张图片,但每篇文章只能有一张图片,因此它们被映射为 OneToManyManyToOne。

现在,我需要选择没有任何相关文章的图片。我该怎么做?

我试过了:

$repository->createQueryBuilder('i')
->select('i')
->where('count(i.articles) = NULL');

但它不起作用。我怎样才能做到这一点?

更新

我在 Type 类中使用它并尝试创建仅包含未使用实体的实体字段,如果相关,这里是完整的功能代码:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('images', 'entity', array(
                'class' => 'BloggerBlogBundle:Image',
                'query_builder' =>
                    function(EntityRepository $er)
                    {
                        return $er->createQueryBuilder('i')->.........here goes query creation

                                                    },
            )
        )
        ;
}

如果需要,这里也是关联:

图像类:

/**
 * @ORM\OneToMany(targetEntity="Blog", mappedBy="image")
 */
protected $articles;

博客类:

/**
 * @ORM\ManyToOne(targetEntity="Image", inversedBy="articles")
 */
protected $image;

【问题讨论】:

    标签: php doctrine-orm


    【解决方案1】:

    试试这个:

    $qb->createQueryBuilder();
    ->select('i');
    ->from('BloggerBlogBundle:Image', 'i')
    ->leftJoin('i.articles', 'a')
    ->where('a is NULL');
    

    【讨论】:

    • 如果我使用它,我会得到:Warning: Missing argument 1 for Doctrine\ORM\EntityRepository::createQueryBuilder()。如果我使用相同的代码但首先调用 createQueryBuilder('i'), I get: Warning: Missing argument 2 for Doctrine\ORM\QueryBuilder::from()`
    • @igorpan,我错过了form() 函数中的参数。发布更新
    • 我得到类未定义错误,但我尝试使用相同的方法:->from('Blogger\BlogBu​​ndle\Entity\Image', 'i')。现在它给了我:[Semantical Error] line 0, col 96 near 'i LEFT JOIN i.articles': Error: 'i' is already defined.
    • 发生这种情况是因为我使用了 ->createQueryBuilder('i') 吗?因为我无法在没有参数的情况下运行 createQueryBuilder。如果这样做,我会收到“缺少参数”错误。
    • 你能发布这两个模型吗?文章和图片
    【解决方案2】:

    您不应该在那里使用count() 函数,并且需要将... = NULL 更改为... is NULL 以便Doctrine 完成它的工作。

    总计:

    $repository->createQueryBuilder('i')
        ->select('i')
        ->where('i.articles is NULL');
    

    【讨论】:

    • 我在使用你的建议时得到这个:[Semantical Error] line 0, col 56 near 'articles is ': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.。与manix的答案相同,如果我使用createQueryBuilder不带参数我会收到错误,所以我使用createQueryBuilder('i')
    • 好吧,是的,我不知道你在哪里使用了这段代码。如果您在图像的存储库中使用它,我认为您不需要那里的参数。
    【解决方案3】:

    已接受的答案不再有效 - 您必须将 .id 添加到 where 表达式:

    $qb->createQueryBuilder();
     ->select('i');
     ->from('BloggerBlogBundle:Image', 'i')
     ->leftJoin('i.articles', 'a')
     ->where('a.id is NULL');
    

    取自 https://stackoverflow.com/a/30034662/1358376

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多