我有两个实体:
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_id
行profiles
在//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我只想要那些没有个人资料的用户?
答案 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;