2016-10-13 4 views
1

У меня проблема с symfony и doctrine, создающим собственный запрос, когда я пытаюсь сопоставить результаты выбора соединения в подзапросе. Я получаю нулевой результат для объединенных полей для ex. ad.availability - null.Symfony Doctrine Native Query Result Mapping Присоединение подзапроса select

В основном у меня есть 2 таблицы деятельности и activity_dates. Мне нужно получить минимальную цену за каждое мероприятие. SQL работает правильно. но застрял в картографии.

Любая идея?

благодаря

$rsm = new ResultSetMapping; 
$rsm->addEntityResult('ActivityBundle:Activity', 'ac'); 
$rsm->addEntityResult('ActivityBundle:ActivityDate', 'ad'); 
$rsm->addFieldResult('ac', 'id', 'id'); 
$rsm->addFieldResult('ac', 'title', 'title'); 
$rsm->addFieldResult('ad','availability','availability'); 


$sql = 'SELECT 
      ac.id, 
      ac.title, 
      ac.price, 
      ad.availability 
     FROM 
      activities ac 
     LEFT JOIN 
      (SELECT 
       id, 
       date, 
       price, 
       activity_id, 
       availability 
      FROM 
       activity_dates a 
      WHERE 
       price = (
        SELECT 
         MIN(price) 
        FROM 
         activity_dates b 
        WHERE 
         b.activity_id = a.activity_id 
       ) 
      ) ad 
     ON 
      ad.activity_id = ac.id'; 


$query = $this->_em->createNativeQuery($sql, $rsm) 
    ->setHint(
     \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 
     'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker' 
    ) 
    ->setHint(
     \Gedmo\Translatable\TranslatableListener::HINT_INNER_JOIN, 
     true 
    ); 
+0

Если вы выполняете запрос без доктрины, вручную заполняя значения, он возвращает то, что вы ожидаете? – Chausser

+0

да. SQL-запрос возвращает правильные значения. – Never

ответ

0

Давайте начнем упростив запрос:

SELECT ac.id, ac.title, ac.price, ad.availability 
FROM activities ac 
LEFT JOIN activity_dates ad 
    ON ad.activity_id = ac.id 
LEFT JOIN activity_dates ad2 
    ON ad2.activity_id = ad.activity_id 
     AND ad2.price < ad.price 
WHERE ad2.price IS NULL 

Самостоятельно присоединиться к activity_dates попытается извлечь записи из ad2, которые имеют более низкую цену, чем в объявлении , Это, конечно же, не удастся, если цена в объявлении будет самой низкой, поэтому запись из ac2 будет пустой. Это то, что мы можем использовать для уменьшения результата через ad2.price IS NULL.

Что я не совсем понимаю: в вашем запросе вы сравниваете цены activity_dates, но выбираете цену активности. Если вам нужна самая низкая цена за каждое мероприятие, вам нужно сравнить цены на действия, а не активность_даты. Или, если вы хотите самый дешевый event_date, тогда вам нужно будет выбрать ad.price. Может быть, это просто опечатка ...

Anyways: С помощью этого упрощенного запроса вы сможете создать свои сущности полезным способом, а затем просто использовать функции запроса доктрины. Здесь нет необходимости делать пользовательские запросы.

Для справки о Самосоединении, смотрите документацию доктрины: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-one-self-referencing

Или, возможно, это ТАК сообщение: Doctrine 2 Self Join Query

В основном это сводится к запросу, как это (принят из проекта Symfony 3):

$query = $this->createQueryBuilder('ac'); 
$query->select('ac.id, ac.title, ac.price, ad.availability') 
    ->leftJoin('ac.activityDates', 'ad') 
    ->leftJoin('ad.selfJoin', 'ad2', Join::WITH, 'ad2.price < ad.price') 
    ->where(
     $query->expr()->isNull('ad2.price') 
    ); 
$result = $query->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY); 
+0

спасибо за ответ. Я попробую и скажу вам результат. о деятельности и датах, у каждого вида деятельности разные цены за разные дни, – Never

+0

Ну, лично я бы хотел увидеть ad.price в этом случае. Но это зависит от вас и только очень небольшое изменение. Помогло ли упрощение? –

+0

@Never: Если мой ответ помог вам решить проблему, подумайте о том, чтобы отметить ее как принятый ответ или, по крайней мере, повысить его. Если это не так, не стесняйтесь добавлять комментарии, поэтому я могу помочь вам решить любые проблемы. Благодарю. –

Смежные вопросы