Doctrine2 QB–如何选择OnetoOne实体没有的实体';t存在


Doctrine2 QB – how to select entities where OnetoOne entity doesn't exists

我有两个实体:

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(因此在profiles表中没有user_id=:user_idprofile行)。然而,我不知道如何制作我的QueryBuilder。

首先,我尝试了一些简单的东西,比如

//u as user
$query = $this->er->createQueryBuilder('u');
$query
    ->join('u.profile', 'p')
    ->where('u.profile = 1');

但这会返回A single-valued association path expression to an inverse side is not supported in DQL queries. Use an explicit join instead.,所以我想我的关系有问题吗?我试着把join()换成leftJoin(),但也无济于事。。。

那么,这个错误是怎么回事?如何用where()设置适当的条件来告诉Doctrine我只想要没有配置文件的用户?

以下是我如何做到这一点的;主机实体和我想选择在一对一关系中没有主机连接的域。

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

此解决方案的积分归此答案所有

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

只需检查null是否为profile 的值

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

尝试使用存储库,例如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;