Задать вопрос

Как написать SQL/DQL запрос при помощи библиотеки Doctrine?

Здравствуйте. Работаю над проетком PHP, который использует для работы с базой данных ORM Doctrine. Необходимо выполнить запрос к базе данных:
SELECT ta.ta_name AS authority
           , ta.ta_id AS taxid
           , ta.ta_amount AS multiplier
           , tam.tam_column_value AS match_value
           , tp.tp_id AS tax_profile_id
           , tp.tp_name AS tax_profile
FROM tax_authority ta
JOIN tax_type tt ON ta.ta_tt_id = tt.tt_id
JOIN tax_auth_match tam ON tam.tam_ta_id = ta.ta_id
JOIN tax_type_match ttm ON ttm.ttm_tt_id = tt.tt_id
JOIN tax_profile_defs tpd ON tt.tt_id = tpd.tpd_tt_id
JOIN tax_profile tp ON tpd_tp_id = tp.tp_id
WHERE ta.ta_active = 'Y'
ORDER BY match_value ASC;

Для запроса использую следующий код как пример:
$entityManager = $this->db->entityManager;
$sql = "SELECT ta.taId, ta.taName, ta.taAmount FROM \TaxAuthority ta"
$query = $entityManager->createQuery($sql);
$query->getResult();

Запрос выше выполняется без проблем. Но как только я добавляю JOIN в запрос я вижу белый экран и больше ничего. Сущности с полями, соответсвующие таблицам из запроса созданы.
Заранее благодарен за любой совет.
  • Вопрос задан
  • 141 просмотр
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Суть ORM - представление сущностей и связей БД в виде объектов. Соответственно и работать с ними, за исключением специфических случаев, надо как с объектами.
В вашем случае код должен выглядеть как-то так:
$taxAuthorities = $this->db->entityManager
    ->getRepository(TaxAuthority::class)
    ->findBy(['active' => true]);
foreach ($taxAuthorities as $taxAuthority) {
    // здесь работа с объектом через геттеры
   // например, $taxAuthority->getTaxType()
}

Если всё-таки хотите построить запрос, то как-то так:
$qb = $this->db->entityManager->createQueryBuilder();
$query = $qb
    ->select('ta.taName', 'ta.taId', 'ta.taAmount', 'tam.tamColumnValue', 'tp.tpId', 'tp.tpName')
    ->from(TaxAuthority::class, 'ta')
    ->innerJoin(TaxType::class, 'tt', Join::WITH, $qb->expr()->eq('tt.ttId', 'ta.taTtId'))
    ->innerJoin(TaxAuthMatch::class, 'tam', Join::WITH, $qb->expr()->eq('tam.tamTaId', 'ta.taId'))
    ->innerJoin(TaxTypeMatch::class, 'ttm', Join::WITH, $qb->expr()->eq('ttm.ttmTtId', 'tt.ttId'))
    ->innerJoin(TaxProfileDefs::class, 'tpd', Join::WITH, $qb->expr()->eq('tpd.tpdTtId', 'tt.ttId'))
    ->innerJoin(TaxProfile::class, 'tp', Join::WITH, $qb->expr()->eq('tp.tpId', 'tpd.tpdTpId'))
    ->where($qb->expr()->eq('ta.taActive', 'Y'))
    ->orderBy('tam.tamColumnValue');
// Посмотреть текст DQL
// echo $query->getDQL();
$result = $query->getQuery()->getResult();

P.S. Нейминг полей, конечно, дичайший.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы