2012-02-06 1 views
1

Насколько я знаю, доктрина dql не позволяет подзапросы внутри объединения.Symfony2, Doctrine DQL, Subquery, получать значения из другой таблицы, используя условие

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

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

 $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

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

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

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

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

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

+0

В базе данных все еще есть таблицы ... – Bart

+0

@Bart, и что еще? Если вы идете с подходом ORM, вам не следует беспокоиться о «таблице» или «базе данных», этот словарь не имеет ничего общего с ORM, основная цель ORM - отвлечь слой persistance и предоставить отображение объектов, может он исходить из реляционной базы данных, XML-документа, сервера NoSQL и т. д. Вы не можете использовать гибридное решение 50% реляционных/50% объектов, вам либо нужно выбирать между тем или иным. Либо используйте собственный запрос SQL, либо подумайте о связи между объектами, а не о том, как они представлены в слое persistance. –

+0

Неважно. Вы можете называть их «таблицами» (терминологией db) или «коллекциями» или любым другим, что вам нравится, но отношения между ними останутся неизменными, в этом случае отношение «один ко многим». Однако я не соглашаюсь на строгое разделение SQL с ORM. Сколько раз вы меняете базовую систему? В большинстве случаев никогда. Однако использование ORM обычно более удобно, когда речь заходит о доступе к свойствам и тому подобному, однако, написание (собственный) SQL-запрос иногда может повысить производительность медленной части вашего программного обеспечения на несколько порядков. Конечным пользователям будет все равно, является ли это ORM/SQL. – Bart