2013-03-29 2 views
2

Использования Symfony2, но его более просто MySQL проблемы ...Symfony2 множественные оставил присоединиться, внутреннее соединение

Я думаю, что у меня есть хорошие схемы таблицы (только важные поля) (код Пояснения):

пользователи (идентификатор) статусы (идентификатор) нравится (идентификатор, user_id, status_id) комментарии (идентификатор, user_id, status_id)

Я делаю большой выбор.

пытается это:

$qb=$this->createQueryBuilder('s') 
      ->addSelect('u') 
      ->addSelect('u2') 
      ->addSelect('u3') 
      ->addSelect('l') 
      ->addSelect('c') 
      ->addSelect('s2') 
      ->where('s.user = :user') 
      ->setParameter('user', $user) 
      ->innerJoin('s.user', 'u') 
      ->leftJoin('s.likes', 'l') 
      ->leftJoin('l.user', 'u2') 
      ->leftJoin('s.comments', 'c') 
      ->leftJoin('c.user', 'u3') 
      ->leftJoin('c.status', 's2') 
      ->orderBy('s.time', 'DESC') 
      ->setMaxResults(15); 

Но результат 15the же статусы ... НЕПРАВИЛЬНО.

Он работал хорошо, когда я выбирал только статусы ... любит статусы .. и пользователи (авторы подобных и статусов)

Как что:

SELECT * FROM statuses s0_ 
INNER JOIN users t1_ ON s0_.user_id = t1_.id 
LEFT JOIN status_likes s2_ ON s0_.id = s2_.status_id 
INNER JOIN users t3_ ON s2_.user_id = t3_.id 

WHERE s0_.user_id = 25 ORDER BY s0_.time DESC LIMIT 15 

, который работает очень хорошо, но, как могу ли я реализовать другие комментарии и (пользователи -> авторы комментариев) выберите ТАМ? ...

ответ

1

Вы не можете установить максимальные результаты по объединенному запросу так, как вы пытаетесь.

Вы должны использовать Paginator, как описано здесь: http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

Если он не доступен в вашей версии доктрины (вы до 2,2) Затем вы можете использовать Paginator здесь: https://github.com/beberlei/DoctrineExtensions

Другой опция состоит в том, чтобы не выполнить соединение в запросе, но просто разрешить автоматическую выборку объединенных данных. Поэтому перебирайте пользователей и перемещайте граф объектов, чтобы получить требуемую информацию. Это, очевидно, вызовет гораздо больше запросов:

$users = $userRepository->findById($user); 
$i = 0; 
for ($users as $user){ 
    $likes = $user->getLikes(); 
    $comments = $user->getComments(); 
    $i++; 
    if ($i == 15) { break; } 
} 

изменить: изменил 'continue' на 'break'; Это коварный код в любом случае - не используйте его, я просто иллюстрирую альтернативу.

Наконец, вы можете использовать нативный запрос для выполнения этого:

http://docs.doctrine-project.org/en/2.1/reference/native-sql.html

Edit: Похожий вопрос: Limiting a doctrine query with a fetch-joined collection?

+0

Первое время слушания о пагинацией ... я 2.2.3 я думаю .. и мне нужно сделать это с меньшим количеством запросов, как posiblle и с лучшими характеристиками ... у меня есть мой запрос в собственном репозитории, и когда я посмотрел вашу ссылку на страницы ... я претипурован, что происходит .. (2AM) не могли бы вы показать мне мою ситуацию более дружелюбным примером с небольшим объяснением или это будет слишком много работы? BTW: когда я УДАЛЕНА из моего запроса. ПРЕДУПРЕЖДЕНИЕ, я получаю все статусы ... НО каждый статус возвращается abou 30times ??? кажется, не очень хорош wroten ... или? – EnchanterIO

+0

Пробовал ли код в верхней части документации для разбивки на страницы? Я подозреваю, что вы можете использовать DQL как SQL, и это не одно и то же. Вы можете получить тот же объект $ query, в примере, вытащив запрос из вашего построителя запросов, как это. $ Qb-> GetQuery(); Подайте это в Paginator в соответствии с примером и посмотрите, поможет ли это. – calumbrodie

+0

thx! хм, похоже, что разбиение на страницы работает. Но когда я пытаюсь подсчитать ($ paginator), я вижу: 50.Что это значит? + что вы говорите на столько же возвращенных строк, когда я пытался просто SQL в phpmyadmin ?? (сначала вопрос из комментария). Для информации, такой как идентификатор статуса ... теперь я получаю доступ к $ status-> getId() и не $ status ['id'] (раньше у меня был getArrayResult в запросе) ... но это нормально, похоже, работает, я просто не уверен насчет выступлений сейчас? от 13ms я имею 260ms !! первый запрос выбирает отдельный идентификатор статусов. а второй - выбор всех данных из этих идентификаторов. HM ??? – EnchanterIO

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