Symfony2 / Doctrine加入了查询

时间:2014-08-08 19:46:42

标签: php symfony doctrine-orm

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

我已经尝试正确设置关联,但我不确定这是否正确。我发现使用这些小字符串标识符的整个想法非常混乱。当然必须有一种更简单的方式来加入?

我的两个实体:

class Users
{
  // ...

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

   // ..
}

class Titles
{
    // ....

    /**
      * @ORM\Column(type="string")
      * @ORM\ManyToOne(targetEntity="Users", inversedBy="username")
     */
     protected $addedBy;

    // ....
}

控制器中包含以下内容:

$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。据我所知,不应该从另一个表中拉出相关字段吗?

1 个答案:

答案 0 :(得分:1)

最佳做法是通过其ID引用实体,您尝试使用用户名引用它。反向字段也应该是特定字段,而不是保存数据的现有字段。并且请记住,此字段是可选的,并将关联定义为双向,对于指定的用例,当您从Titles实体加入时,实际上并不需要它。我建议在这里阅读文档http://symfony.com/doc/current/book/doctrine.html#entity-relationships-associations以及此处http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

双向关联(带反向字段)

首先摆脱那条线:

  @ORM\Column(type="string")

在您的$addedBy注释中,将inverseBy="username"更改为inversedBy="titles"(请注意拼写错误)

你可以选择添加

@ORM\JoinColumn(name="user_id", referencedColumnName="id")

然后在您的用户实体中添加

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

摆脱

* @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")

$username注释中

最后确保更新数据库架构

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

单向关联(没有反向字段)

摆脱

* @ORM\OneToMany(targetEntity="Titles", mappedBy="addedBy")

$username注释中

然后在$addedBy注释中删除该行:

  @ORM\Column(type="string")

以及inverseBy="username"

你可以选择添加

@ORM\JoinColumn(name="user_id", referencedColumnName="id")

最后确保更新数据库架构

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