显然,正如所讨论的here,Doctrine2可能不会很好地支持One to Zero或One关系。但是,当我尝试执行此操作时,数据库结构正确显示给我,我只是在尝试执行“可选”操作时遇到问题。加入那张桌子。
以下是我的实体:
<?
// User.php
class User {
/** @ManyToOne(targetEntity="Location")
* @JoinColumn(name="location_id", referencedColumnName="id", nullable=true)
**/
private $location;
// Getters and setters...
}
// Location.php
class Location {
// ...
}
基本上,这是从一对一关联的Doctrine2 docs示例中复制的,加上属于@JoinColumn
的可归属性。
当我尝试查询User表并包含Location(如果存在)时,会出现问题。以下是我尝试实现这一目标的方法:
$user = $this->entityManager->createQuery('SELECT u, l FROM e:User u JOIN u.location l WHERE u.email = ?1')
->setParameter(1, $email)
->getResult();
场景#1:电子邮件存在且该用户存在位置
结果#1:具有水合位置属性的用户对象
场景#2:电子邮件存在且该用户不存在位置
结果#2:清空数组
我希望方案#2返回一个位置属性为null的User对象,是否有任何建议?
答案 0 :(得分:0)
这很尴尬,我显然没有正确的SQL思考上限(因为它是DQL和所有)。我需要使用 LEFT JOIN ,而不仅仅是 JOIN 。这是我在脸上拍打自己的部分。
我刚刚将查询更改为:
$user = $this->entityManager->createQuery('SELECT u, l FROM e:User u LEFT JOIN u.location l WHERE u.email = ?1')
->setParameter(1, $email)
->getResult();