我需要创建一个简单的查询,该查询生成数据库条目的结果集以及发布它的人的用户名。
我已经尝试正确设置关联,但我不确定这是否正确。我发现使用这些小字符串标识符的整个想法非常混乱。当然必须有一种更简单的方式来加入?
我的两个实体:
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。据我所知,不应该从另一个表中拉出相关字段吗?
答案 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")
最后确保更新数据库架构
然后您的查询应返回预期结果。