在我的Symfony 4项目中,我有一个Entity Class
Users
,其属性为firstName
和familyName
,我想添加类似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
等,但是我需要这个。从我的角度来看,这会更好一些。
答案 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 = ?')