试图从Symfony中的数据库中检索数据失败

时间:2014-10-29 21:39:00

标签: php symfony doctrine-orm

我尝试使用以下代码从我的数据库中检索数据:

    $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(),一切正常,但我得到所有对象,我只需要一些。

2 个答案:

答案 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