Symfony Doctrine2使用with子句连接表

Symfony Doctrine2使用with子句连接表,symfony,doctrine,dql,Symfony,Doctrine,Dql,我有一个用户实体和一个UserData实体,它们通过外键链接到用户 用户实体具有以下映射: /** * @ORM\OneToOne(targetEntity="UserData", cascade={"persist", "remove"}) * @var integer */ protected $userData; UserData有一个简单的ID字段: /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\Gen

我有一个用户实体和一个UserData实体,它们通过外键链接到用户

用户实体具有以下映射:

    /**
 * @ORM\OneToOne(targetEntity="UserData", cascade={"persist", "remove"})
 * @var integer
 */
protected $userData;
UserData有一个简单的ID字段:

    /**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 * @var integer
 */
protected $id;
嗯,;我想检索一个用户实体,其UserData具有字段'NIN'值'a0000000';我正在尝试使用此DQL查询:

SELECT u FROM eCommerceUserBundle:User u JOIN eCommerceUserBundle:UserData ud ON u.userData = ud.id WHERE ud.NIN = :NIN
但我得到了这个错误:

预期的条令\ORM\Query\Lexer::T_WITH,得到'ON'

所以…我尝试退出ON子句,如下所示:

SELECT u FROM eCommerceUserBundle:User u JOIN eCommerceUserBundle:UserData ud WHERE ud.NIN = :NIN
SELECT u, ud 
FROM eCommerceUserBundle:User u 
JOIN u.userData ud
WHERE ud.NIN = :NIN
现在的问题是条令提出的原始质疑:

    SELECT 
  u0_.id AS id0, 
  u0_.email AS email1, 
  u0_.password AS password2, 
  u0_.created AS created3, 
  u0_.lastLogin AS lastLogin4, 
  u0_.confirmed AS confirmed5, 
  u0_.blocked AS blocked6, 
  u0_.particularData_id AS particularData_id7, 
  u0_.institutionalData_id AS institutionalData_id8, 
  u0_.administratorData_id AS administratorData_id9 
FROM 
  user u0_ 
  INNER JOIN userData u1_ ON (u1_.NIN = ?)
所以看来,条令正在把我的WHERE从句推到ON从句


我能做什么?

DQL查询应该是这样的:

SELECT u FROM eCommerceUserBundle:User u JOIN eCommerceUserBundle:UserData ud WHERE ud.NIN = :NIN
SELECT u, ud 
FROM eCommerceUserBundle:User u 
JOIN u.userData ud
WHERE ud.NIN = :NIN

您可以通过从select子句中删除
ud
来选择用户及其userData,也可以不选择它-尽管如此,
User
对象的数组仍将返回,但如果从一开始就填充了userData,则不选择它将首先在
$User->getUserData()上向数据库发起新的查询

DQL查询应如下所示:

SELECT u FROM eCommerceUserBundle:User u JOIN eCommerceUserBundle:UserData ud WHERE ud.NIN = :NIN
SELECT u, ud 
FROM eCommerceUserBundle:User u 
JOIN u.userData ud
WHERE ud.NIN = :NIN
您可以通过从select子句中删除
ud
来选择用户及其userData,也可以不选择它-尽管如此,
User
对象的数组仍将返回,但从一开始就填充了userData-不选择它将首先在
$User->getUserData()
上向数据库发起新的查询