Symfony2获取oneToMany实体的一行


Symfony2 Get just 1 row of oneToMany Entity

我有一个用户实体和一个日志实体。我有一个从用户到日志的OneToMany连接。"我的日志表"中按用户存储的日志项。

我输出一个用户列表:

控制器:

$user = $this->getDoctrine()
        ->getRepository('SeotoolMainBundle:User')
        ->findBy(array('isActive' => 1, 'isAdmin' => 0));
树枝>
{% for user in list_user %}
    {{ user.username }}
{% endfor %}

现在我想接收日志表的一行,按一个名为"日期"的字段排序,并像这样在for用户循环中返回它:

{% for user in list_user %}
    {{ user.username }}
    {{ user.log.lastEntry
{% endfor %}

我该怎么做?

实体User.php:

/**
 * @ORM'OneToMany(targetEntity="Log", mappedBy="user")
 * @ORM'OneToMany(targetEntity="Log", mappedBy="editor")
 */
protected $log;

实体Log.php

/**
 * @ORM'ManyToOne(targetEntity="User", inversedBy="log")
 * @ORM'JoinColumn(name="user", referencedColumnName="id")
 */
protected $User;

假设您访问Log Collection对象的getter是getLogMessages方法,并且假设您可以使用getMessage方法访问日志消息,下面应该解决这个问题:

{{ User.getLogMessages().last().getMessage() }}

last方法允许您访问存储在集合中的最后一个元素。

顺便说一下,您应该使用OrderBy注释,否则必须认为顺序未定义。(尽管在现实中,您通常会按照插入的顺序获得元素)。

我现在在TWIG中解决了它。但这一点都不好……我更喜欢控制器内部的解决方案,而不是在视图中。

{% for log in last_userlog|reverse if(log.user.Id == user.Id) %}
    {% if loop.index == 1 %}
        {{ log.logTitle }}
    {% endif %}
{% endfor %}