Php Symfony2/条令关联查询

Php Symfony2/条令关联查询,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我需要创建一个简单的查询,它生成一个数据库条目加上发布它的人的用户名的结果集 我已尝试正确设置关联,但我也不确定这是否正确。我发现使用这些小字符串标识符的整个想法相当混乱。肯定有更简单的连接方式吗 我的两个实体: class Users { // ... /** * @ORM\Column(type="string") * @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy") */ prote

我需要创建一个简单的查询,它生成一个数据库条目加上发布它的人的用户名的结果集

我已尝试正确设置关联,但我也不确定这是否正确。我发现使用这些小字符串标识符的整个想法相当混乱。肯定有更简单的连接方式吗

我的两个实体:

class Users
{
  // ...

  /**
    * @ORM\Column(type="string")
    * @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")
    */
    protected $username;

   // ..
}

控制器中包含以下各项:

$titles = $em->createQueryBuilder()
             ->select('t.*', 'u.*')
             ->from('dvdLoggerdvdBundle:Titles', 't')
             ->leftJoin('t.addedBy', 'u')
             ->addOrderBy('t.title', 'DESC')
             ->getQuery()
             ->getResult();
我得到以下错误:

[Semantical Error] line 0, col 69 near 'u ORDER BY t.title': Error: Class 
dvdLogger\dvdBundle\Entity\Titles has no association named addedBy `
更新1

我按照汤姆的建议做了所有的修改,并且读了很多书

似乎为了克服延迟加载特性,我需要执行leftJoin。我已将我的查询改写如下:

public function getAllTitles()
{
    // view all records in db
    $titles = $this->createQueryBuilder('t')
        ->select('t, u')
        ->leftJoin('t.addedBy', 'u')
        ->addOrderBy('t.title', 'DESC');

    return $titles->getQuery()->getResult();

}

我得到了一个结果集,但是当我转储结果集时,
addedBy
返回NULL。据我所知,这不应该从另一个表中拉入相关字段吗?

最佳做法是通过实体的id引用实体,您尝试使用用户名引用实体。反转字段也应该是一个特定字段,而不是保存数据的现有字段。请记住,此字段是可选的,并将关联定义为双向的,对于指定的用例,当您从Titles实体加入时,实际上不需要它。我建议你在这里和这里都读一下这份文件

双向关联(带反转字段) 首先去掉那句话:

  @ORM\Column(type="string")
$addedBy
注释中,将
inverseBy=“username”
更改为
inversedBy=“titles”
(注意打字错误)

您可以选择添加

@ORM\JoinColumn(name=“user\u id”,referencedColumnName=“id”)

然后在用户实体中添加

  /**
    *
    * @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")
    */
    protected $titles;
摆脱

* @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")
* @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")
$username
注释中

最后,请确保更新数据库架构

然后您的查询将返回预期的结果

单向关联(带反方向字段) 除掉

* @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")
* @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")
$username
注释中

然后去掉
$addedBy
注释中的那一行:

  @ORM\Column(type="string")
以及
inverseBy=“username”

您可以选择添加

@ORM\JoinColumn(name=“user\u id”,referencedColumnName=“id”)

最后,请确保更新数据库架构


然后,您的查询将返回预期结果。

我怀疑您只是试图在没有用户对象其余部分的情况下获取用户名?不会发生的。条令是一个对象关系管理器,因此它希望使用对象。因此,您可以获取标题并加入用户。然后使用:$title->getAddedBy()->getUsername();完成文档中的产品/类别示例:以基本了解操作系统正在发生的事情。谢谢Cerad,你的权利。。我需要重新调整一下我的脑袋。我来看看这个极好的答案,非常感谢汤姆。我现在认为查询不需要
join
方法,对吗?第二个表的结果只有在被请求时才会返回?是的,您是对的,但请记住,在检索实体时,条令具有不同的获取模式。虽然您确实可以在一对多关联上使用默认的“惰性”模式,但它会发出大量的小请求(基本上每次您第一次请求关联实体时),因此它通常更适合于原型化。在查询中使用“JOIN”子句或将fetch模式设置为“EAGER”(在原则2.5+中)将在一个更大的请求中获得所有结果。是的,当我以前所看到的都是更即时的sql检索方法时,我很有兴趣了解延迟加载的想法。我来看看“渴望”模式,我还没有遇到过。