Как выбрать все поля таблицы с помощью DQL в режиме HYDRATE_ARRAY?

Есть Entity Treatment, имена свойств которой отличаются от имен столбцов таблицы в БД.
При селект запросе выбираются все поля, кроме поля "contract", которое является внешним ключом к справочнику.
Вот оно:
/**
     * @var \Medcard\Entity\Contract
     *
     * @ORM\ManyToOne(targetEntity="Medcard\Entity\Contract")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="contract_id", referencedColumnName="id")
     * })
     */
    private $contract;


Я использовал для выборки следующий запрос:
$data = $this->entityManager->createQuery('SELECT e FROM ' . self::ENTITY_NAME 
        . ' e WHERE e.medcard = ?1')
        ->setParameter(1, $id)->getSingleResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);

Но он не возвращал мне поле contract.
Тогда я переписал так:
$data = $this->entityManager->createQuery('SELECT e, c.id as contract FROM ' 
        . self::ENTITY_NAME . ' e ' . ' JOIN e.contract c WHERE e.medcard = ?1')
        ->setParameter(1, $id)->getSingleResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);

Но мне кажется, использовать в данном случае JOIN это лишнее, ведь в treatment и так есть значение, которые я хочу выбрать (contract_id).
Подобные проблемы есть с другими Entity.
Мне нужно просто получить все данные из таблицы, но с именами полей, которые соответствуют свойствам в Entity, а не БД, что бы в дальнейшем можно было выполнить гидратацию. (Т.е. не contract_id, a contract, medcard_id -> medcard)

Если получать объект вместо массива, а потом экстрактить, то возвращается объект contract, а не его ID, к тому же возвращается еще много ненужных объектов, связанных с данной Entity.
  • Вопрос задан
  • 2700 просмотров
Решения вопроса 1
@neolink
doctrine-orm.readthedocs.org/en/latest/reference/d...
попробуйте так:
IDENTITY(e.contract) as contract
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@yuklia_1

Мне нужно просто получить все данные из таблицы, но с именами полей, которые соответствуют свойствам в Entity, а не БД, что бы в дальнейшем можно было выполнить гидратацию. (Т.е. не contract_id, a contract, medcard_id -> medcard)


для этого в Entity просто указывайте имя поля, которое вам необходимо,а для полей БД переодределить его
Например:
/**
     * @var string
     * @ORM\Column(type="string",name="last_name")
     */
    protected $lastName;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы