我尝试使用以下代码从我的数据库中检索数据:
$user = $this->get('security.context')->getToken()->getUser();
$pm = $this->getDoctrine()
->getRepository('LoginLoginBundle:Privatemessage')
->findOneByUser_userid($user->getUserid());
然后在我的twig文件中我使用它:
{% for i in 0..(pm|length-1)%}
<tr>
<td>{{pm[i].sender}}</td><td></td><td>{{pm[i].subject}}</td>
</tr>
<tr>
<td>{{pm[i].contents()}}</td>
</tr>
{% endfor %}
然而,这失败了,并且给了我以下错误:
Impossible to access a key "0" on an object of class "Login\LoginBundle\Entity\Privatemessage" that does not implement ArrayAccess interface in LoginLoginBundle:Default:manager.html.twig at line 20
如果我使用findall(),一切正常,但我得到所有对象,我只需要一些。
答案 0 :(得分:2)
findOneBy()
方法仅用于查询对象的一个实例。它不会返回您可以迭代的集合。
在您分享的代码中,您只提取 {/ 1}}的实例,并且您正在尝试操纵它,就像它是私人消息的集合一样。你不能那样做。
使用Privatemessage
时,您的代码运行正常,因为findAll()
会返回ArrayCollection个您可以迭代的私人消息。
如果您希望根据任何给定的约束获得仅一些私信,那么在查询时您需要apply filters。
答案 1 :(得分:1)
我想您想要检索给定用户的所有私人消息并显示它们。在这种情况下,您应该使用findBy*()
而不是findOneBy*()
。前者将返回ArrayCollection
而不是PrivateMessage
的实例。
$user = $this->get('security.context')->getToken()->getUser();
$pm = $this->getDoctrine()
->getRepository('LoginLoginBundle:Privatemessage')
->findByUser_userid($user->getUserid());
我还建议使用 Twig &#39; for
来遍历集合中的每个项目,如下所示:
{% for message in pm %}
<tr>
<td>{{message.sender}}</td><td></td><td>{{message.subject}}</td>
</tr>
<tr>
<td>{{message.contents()}}</td>
</tr>
{% endfor %}
您可以阅读文档here。