Doctrine2 QB - 如何选择OnetoOne实体不存在的实体

时间:2015-02-06 15:05:12

标签: php doctrine-orm query-builder

我有两个实体:

class User extends BaseEntity {

    /**
     * @ORM\OneToOne(targetEntity="Profile", mappedBy="user", cascade={"persist", "remove"})
     * @var Profile
     */
    protected $profile;
}

class Profile extends BaseEntity {

    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="profile", cascade={"persist"})
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
     * @var User
     */
    protected $user;
}

我尝试做的只是选择没有任何个人资料的users(因此profile行没有user_id=:user_idprofiles//u as user $query = $this->er->createQueryBuilder('u'); $query ->join('u.profile', 'p') ->where('u.profile = 1'); 表中。但是,我不知道如何制作我的QueryBuilder。

首先,我尝试了像

这样简单的事情
A single-valued association path expression to an inverse side is not supported in DQL queries. Use an explicit join instead.

但是返回join()所以我想我的关系有问题吗?我试图为leftJoin()切换where(),但它也没有帮助......

那么该错误是什么以及如何使用{{1}}来说明正确的条件告诉Doctrine我只想要那些没有个人资料的用户?

3 个答案:

答案 0 :(得分:3)

以下是我能够做到的。基本上我有Domain&托管实体和我想选择一对一关系中没有托管主机的域。

$er->createQueryBuilder('d')
                    ->leftJoin('d.hosting', 'h')
                    ->where('h.id is NULL');

此解决方案的信用额转到此Answer

希望它对您有用,因为我们的情况几乎相同。

答案 1 :(得分:1)

只需检查null作为profile

的值
//u as user
$query = $this->er->createQueryBuilder('u');
$query
    ->where('u.profile is NULL');

答案 2 :(得分:0)

尝试使用存储库,例如 UserRepository

$qb = $this->createQueryBuilder('u');
$e  = $qb->expr();
$qb->leftJoin('u.profile', 'p')
    ->where($e->isNull('p.id'))

原始查询将如下所示:

SELECT * FROM users AS u LEFT JOIN u.profile AS p WHERE p.id IS NULL;