在symfony2中使用DQL从Entity获取自定义getter值

时间:2016-08-28 19:15:45

标签: symfony doctrine-orm fosuserbundle dql fosrestbundle

我使用 FOSUserBundle FOSRestBunldle Symfony 2.8 ,并且必须获得一个带有年龄的短用户列表,但是没有字段'年龄'在用户数据库中,这就是为什么我的User实体类有这个自定义getter来从birthdate字段计算年龄

public function getAge()
{
    $now = new \DateTime('now'); 
    $age = $this->birthdate->diff($now);
    return $age->format('%y');
}

使用" u.age"获取我的用户列表并将其序列化为json然而,不起作用,因为没有与 u.age 相关联的真实字段

$query = $em->createQuery('SELECT u.username, u.age FROM AppBundle:User u');
$users = $query->getResult();

使用具有->findAll()的存储库可以获得年龄,但也会加载许多其他相关实体(用户的帖子,评论),这些在这里不需要,并且会有点过载。

如何只使用用户名年龄来获取用户列表?

谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您在DB中没有age字段,这也意味着您在Doctrine映射中没有该字段,因此您无法选择它。学说对此一无所知。

您需要选择在实体实例中计算它所需的数据。在这种情况下,为了计算用户的年龄,您可能想要选择生日日期。

E.g:

$query = $em->createQuery('SELECT u.username, u.birthday FROM AppBundle:User u');
$users = $query->getResult();

然后你应该能够在PHP代码中从你的实体中获得年龄。

答案 1 :(得分:2)

我找到了解决方案。使用注释@VirtualProperty告诉序列化器获取值。

use JMS\Serializer\Annotation\VirtualProperty;

必须包含在Entity类中,因此注释可以正常工作。

/**   
 * @VirtualProperty 
 */
public function getAge()
{