Создаются лишние запросы Symfony Doctrine QB

У меня есть серия похожих запросов для получения значительного количества информации из базы данных.

Все они имеют базовую настройку, как показано ниже, только с разными таблицами.

Проблема в том, что для каждого элемента в $version_ids он будет генерировать запросы SELECT * для 3 конкретных таблиц ниже.

SELECT * FROM prices WHERE version_id = $version_ids[n] // this only for explanation purposes

SELECT * FROM ct_insurance WHERE version_id = $version_ids[n]
SELECT * FROM costs WHERE version_id = $version_ids[n]

Итак, если $ version_ids имеет 10 элементов, он сгенерирует 30 запросов, по 10 для каждой из приведенных выше таблиц.

Общей чертой этих таблиц является то, что они имеют взаимно однозначную связь с версией таблиц, например:

class Ct_insurance
{

/** 
* @ORM\Id 
* @ORM\OneToOne(targetEntity = "Version", inversedBy = "ct_insurance") 
*/
private $version;

Также обратите внимание, что даже если у вас есть указанная серия запросов, эти нежелательные запросы генерируются только один раз. Итак, не менее 30 запросов для каждого запроса в серии.

Это один из примеров запроса:

    public function getBrandPageData1($version_ids)
{
    $doctrineConfig = $this->getEntityManager()->getConfiguration();
    $doctrineConfig->addCustomStringFunction('field', 'DoctrineExtensions\Query\Mysql\Field');

    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select("v, field(v.id,:ids) as HIDDEN field")
        ->addSelect('b.brand AS brand')
        ->addSelect('b.imgLogoBig')
        ->addSelect('m.id AS model_id')
        ->addSelect('m.model AS model')
        ->addSelect('s.id AS segment_id')
        ->addSelect('s.segment AS segment')
        ->addSelect('v.id AS version_id')
        ->addSelect('v.version AS version')
        ->addSelect('v.places AS places')
        ->addSelect('i.imgPath AS img_path')
        ->addSelect('w.wrYear AS wr_year')
        ->from('AppBundle:Version', 'v')
        ->join('v.model', 'm')
        ->join('m.brandId', 'b')
        ->join('m.segmentId', 's')
        ->join('m.images', 'i')
        ->join('AppBundle:Warranty', 'w', 'WITH', 'w.brand = b.id')
        ->where('v.id IN (:ids)')
        ->orderBy('field')
        ->groupBy('v.id')
        ->setParameter('ids', $version_ids);
    try {
        $query = $qb->getQuery();
        return $query->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return $e;
    }
}

Я попытался сгенерировать те же запросы в DQL, но получил ошибку в предложении GROUP BY.

Спасибо

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
25
1

Ответы 1

Узнал, что это было, по крайней мере, так кажется.

На первом select ссылка на v генерирует объект-сущность, который затем, по-видимому, вызывает все отображенные сущности.

Итак, это решило это:

$qb->select("field(v.id,:ids) as HIDDEN field")

Другие вопросы по теме