Symfony2, Doctrine DQL, Subquery, получить значения из другой таблицы, используя условие - PullRequest
1 голос
/ 06 февраля 2012

Насколько я знаю, doctrine dql не разрешает подзапросы внутри объединения.

У меня есть таблица и таблица трансляции.Отношение один ко многим.Одна запись имеет много переводов.

Чтобы получить правильную строку перевода из таблицы translatiosn, которую я выполнил, выбрал в предложении select:

        $query = $this->getDoctrine()->getEntityManager()
            ->createQuery('
                SELECT w.id, w.pastid, w.name, w.jsonParameters as params, m.id as milestone_id, m.name as milestone_name,
                m.slug as milestone_slug, m.startdate as milestone_start, m.enddate as milestone_end, 
                w.expand as expand, w.backgroundcolor as background, w.colorschema as colorschema, w.headline as headline, w.subheadline as subheadline, w.text as text, w.expandheight as expandheight,  
                w.url as url, w.created as created, w.updated as updated, wt.name as wtname, ws.weight as width, ws.height as height
                , (SELECT t.headline FROM AdminBundle:widgetTranslation t WHERE t.widget = w.id and t.locale = :published) AS headline_trans
                , (SELECT t2.subheadline FROM AdminBundle:widgetTranslation t2 WHERE t2.widget = w.id and t2.locale = :published) AS subheadline_trans
                , (SELECT t3.text FROM AdminBundle:widgetTranslation t3 WHERE t3.widget = w.id and t3.locale = :published) AS text_trans
                FROM AdminBundle:Widget w
                JOIN w.milestone m
                JOIN w.widgetType wt
                JOIN w.widgetShape ws
                WHERE w.published = 1
                ORDER BY m.order, w.order
            ')->setParameter('published', $currentLocale);

        $result = $query->getArrayResult();

.производительность, есть ли лучший запрос для этого?

1 Ответ

0 голосов
/ 28 августа 2012

Во-первых, мне нужно кое-что прояснить.В вашем вопросе что-то действительно неправильно .Вы используете ORM, верно?Но вы говорите о столах.ORM не заботится о том, как ваши таблицы организованы или связаны между собой.Это имеет значение только для отношений между самими объектами.

Однако, если вы беспокоитесь о производительности, лучшее, что вы можете сделать, как и любой другой запрос SQL, - это EXPLAIN it.

Поскольку вы используете Symfony 2.0, вы можете использовать профилировщик (доступный в dev env), чтобы просмотреть EXPLAIN результаты вашего запроса.

Убедитесь, что используется индекс, и чтоколичество строк для поиска не слишком велико.

В зависимости от вашего результата вам может потребоваться использовать другую стратегию для получения перевода или переписать запрос на собственном SQL, чтобы обеспечить большую гибкость.

...