我有两个实体:
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_id
的profile
行)。然而,我不知道如何制作我的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;