我正试图用以下代码从数据库中检索数据:
$user = $this->get('security.context')->getToken()->getUser();
$pm = $this->getDoctrine()
->getRepository('LoginLoginBundle:Privatemessage')
->findOneByUser_userid($user->getUserid());
然后在我的小树枝文件中,我使用这个:
{% 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(),一切都很好,但我得到了所有的对象,我只需要几个。
findOneBy()
方法仅用于查询对象的一个实例。它不返回一个可以迭代的集合。
在您共享的代码中,您只获取Privatemessage
的一个实例,并试图将其当作私有消息的集合进行操作。你不能那样做。
当您使用findAll()
时,您的代码运行良好,因为findAll()
返回了一个可以迭代的私有消息的ArrayCollection。
如果您想基于任何给定的约束只获取部分私人消息,则必须在查询时应用筛选器。
我想您想要检索给定用户的所有私有消息并显示它们。在这种情况下,应该使用findBy*()
而不是findOneBy*()
。前者将返回一个ArrayCollection
,而不仅仅是PrivateMessage
的一个实例。
$user = $this->get('security.context')->getToken()->getUser();
$pm = $this->getDoctrine()
->getRepository('LoginLoginBundle:Privatemessage')
->findByUser_userid($user->getUserid());
我还建议使用Twig的for
来遍历集合中的每个项目,如下所示:
{% for message in pm %}
<tr>
<td>{{message.sender}}</td><td></td><td>{{message.subject}}</td>
</tr>
<tr>
<td>{{message.contents()}}</td>
</tr>
{% endfor %}
您可以在此处阅读文档。