Есть ли способ иметь свойство Entity в Symfony, которое содержит комбинацию свойств одного и того же объекта? - PullRequest
0 голосов
/ 28 мая 2019

В моем проекте Symfony 4 у меня есть Entity Class Users со свойствами firstName и familyName, и я хотел бы добавить что-то вроде fullName, которое будет объединением этих двух, но без добавления столбца в DB. Мне это нужно, например, для шоу в front-end и фильтрации в таблицах. Но иногда также необходимо разделение.

Определение класса:

/**
 * 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 с геттерами и сеттерами:

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

Есть ли простой способ, как сказать Доктрине, что это свойство исходит не из БД, а существует как "виртуальный столбец"? Я знаю, что могу использовать функцию DQL Concat и т. Д., Но мне это нужно. И с моей точки зрения это немного лучше.

1 Ответ

0 голосов
/ 02 июля 2019
public function getFullName(): string
{
    return \implode(', ', \array_filter([$this->getFamilyName(), $this->getFirstName()]));
}

Это все, что вам нужно, чтобы получить полное имя из сущности.

Но так как у вас его нет в отображении или в реальном столбце таблицы, вы должны использовать выражение DQL, например:

createQueryBuilder()->select("CONCAT(u.familyName, ', ', u.firstName)")->from('App\Entity\Users','u')->where('u.id = ?')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...