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检索方法时,我很有兴趣了解延迟加载的想法。我来看看“渴望”模式,我还没有遇到过。