有没有一种方法可以在Symfony中拥有Entity属性,而该属性包含相同Entity的属性组合?

时间:2019-05-28 07:58:11

标签: php entity-framework doctrine-orm doctrine symfony4

在我的Symfony 4项目中,我有一个Entity Class Users,其属性为firstNamefamilyName,我想添加类似fullName的内容这两个的串联,但是没有在DB中添加列。我需要它例如在前端显示和在表中过滤。但有时还需要分离。

类定义:

/**
 * Users
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 */
class Users
{
    /**
     * @var string
     *
     * @ORM\Column(name="FIRST_NAME", type="string", length=25, nullable=false)
     */
    private $firstName;

    /**
     * @var string
     *
     * @ORM\Column(name="FAMILY_NAME", type="string", length=25, nullable=false)
     */
    private $familyName;

  // Other properties and getters + setters
}

当我仅将属性fullName与getter和setter一起添加时:

private $fullName;

public function getFullName():?string
{
    return $this->getFamilyName().', '.$this->getFirstName();
}

public function setFullName(string $fullName): self{
    return $this;
}

并在QueryBuilder中将其用作

createQueryBuilder()->select('u.fullName')->from('App\Entity\Users','u')->where('u.id = ?')...

然后我收到此错误:

'fullName FROM': Error: Class App\Entity\Users has no field or association named fullName

有什么简单的方法可以对Doctrine说,该属性不是来自DB,而是作为“虚拟列”存在?我知道,我可以使用DQL函数Concat等,但是我需要这个。从我的角度来看,这会更好一些。

1 个答案:

答案 0 :(得分:0)

public function getFullName(): string
{
    return \implode(', ', \array_filter([$this->getFamilyName(), $this->getFirstName()]));
}

这就是从Entity检索fullName所需的全部内容。

但是由于您在映射中或表中没有实际列时没有它,因此应使用DQL表达式,如下所示:

createQueryBuilder()->select("CONCAT(u.familyName, ', ', u.firstName)")->from('App\Entity\Users','u')->where('u.id = ?')