Doctrine2加入一对一或零

时间:2015-03-10 18:35:41

标签: php doctrine-orm

显然,正如所讨论的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对象,是否有任何建议?

1 个答案:

答案 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();