У меня есть серия похожих запросов для получения значительного количества информации из db.
Все они имеют базовую настройку, как показано ниже, только с разными таблицами.
Проблема в том, что для каждого элемента в $version_ids
он будет генерировать запросы SELECT *
для трех конкретных таблиц ниже.
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.
Спасибо
Выяснил, что это было, или так кажется.
При первом select
ссылка на v
генерирует объект сущности, который затем, по-видимому, вызывает все сопоставленные объекты.
Поэтому это решило:
$qb->select("field(v.id,:ids) as HIDDEN field")