2017-01-23 2 views
0

Мне было интересно, можно ли изменить $this->getDoctrine()->getRepository('AppBundle:Foo')->findAll(), так что я получаю только ID связанных объектов. Поскольку Foo связан с «одним пользователем» и «несколькими группами», я всегда получаю в результате «весь объект пользователя» и «ВСЕ объекты группы» в результате, что делает результат очень неясным. Итак, можно ли печатать только идентификаторы связанных объектов?(Symfony) Doctrine ORM findAll: too much information

Я надеюсь, что кто-то может мне помочь. Благодаря!

+2

В этом случае вы должны использовать DQL вместо встроенных методов репозитория. –

ответ

-1

Вам придется написать свой собственный запрос:

$query = $this->getDoctrine()->getManager()->createNativeQuery('SELECT id FROM foo'); 
$foos= $query->getResult(); 

выше должен работать увидеть здесь для получения дополнительной информации http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html

+1

Собственные запросы - это плохое предложение, поскольку они обходят DBAL и связывают ваше приложение с конкретным продуктом БД. Родные запросы всегда являются вашим последним прибежищем, только для использования, если все остальное терпит неудачу. – lxg

+0

Кроме того, в чем смысл 'WHERE 1 = 1'? Это имеет смысл только в дерьмовых приложениях, которые расширяют формулировку SQL через неясные фильтры. (* кашель * ... WordPress ... * cough *) – lxg

+0

Это, пожалуйста, выберите все ... Извините, я так часто использую доктрину, что редко пишу sql-запросы. И поскольку он не вводит в него какие-либо внешние входы от пользователя, я не понимаю, почему это было бы менее безопасно ... –

5

Вы не должны получить полные сущности, вы можете, как выберите только нужные поля. Вместо списка сущностей вы получите список простых массивов, где каждый массив содержит выбранные поля.

$ids = $em->createQueryBuilder() // $em is your entity manager 
    ->select("foo.id") 
    ->from("AppBundle:Foo", "foo") 
    ->getQuery()->getResult(); 

$ids = array_map("current", $ids); 

Примечание: Последняя строка не является обязательной, она будет «сглаживать» ваш массив при выборе только одного поля.

+0

В дополнение к этому решению я бы предложил сделать 'getResult (AbstractQuery :: HYDRATE_SCALAR)'. Это делает последнюю строку кода ненужной, как только Doctrine сделает результат 'getResult' массивом – Stepashka

+0

@Stepashka Может быть, вы можете объяснить, почему вы предлагаете это и что именно эта строка делает? Только предлагать вещи без каких-либо объяснений никому не помогут. – Wilt

+0

@ lxg Если определенные ассоциации отмечены как 'fetch =" EAGER ", это может привести к ненужным объединениям? Или нет? – Wilt

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