[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: вопрос по Doctrine
Bolik
привет,

я в таблице user добавил поля как сказано здесь, но теперь не пойму как правильно сделать выборку.

т.к. не только я могу добавлять друзей, но и меня добавить могут, нужно выбирать из $myFriends и $friendsWithMe. пока написал такой (говно)запрос:


public function findFriends($id)
{
return $this->getEntityManager()
->
createQuery(
'SELECT us from AppBundle:User us WHERE
(us.id IN (SELECT f FROM AppBundle:User u LEFT OUTER JOIN u.friendsWithMe f WHERE u.id = :id)
OR us.id IN (SELECT ff FROM AppBundle:User use LEFT OUTER JOIN use.myFriends ff WHERE use.id = :id))'

)
->
setParameters(array('id' => $id))
->
getResult();
}


в принципе работает, но я не могу оценить насколько это правильно, т.к. в sql опыта очень мало?

а как мне потом из этого запроса выбрать сообщения мои и друзей, пока что не соображу :)

спасибо за критику.
DragonNoir
А таблица User - это таблица пользователей или их отношений? Боюсь, что тут ошибка в структуре БД.
Что касается самого запроса, то при малом количестве записей он работает, а при большом - будет тяжело. Посмотрите explain такого запроса и оцените его производительность. Вообще, джойнить таблицу саму с собой, да еще несколько раз, плохая идея.

_____________
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
kaww
Давно не имел дела с доктриной, но мне кажется, что задача решается примерно так
SELECT f FROM AppBundle:User f
JOIN AppBundle:User u
WHERE u.id = :id


Еще есть MEMBER OF
SELECT f FROM AppBundle:User f WHERE :id MEMBER OF f.myFriends
DragonNoir
Тут вопрос не в доктрине, а в самом запросе. Ваш запрос вернет всех пользователей из таблицы User и прилепит к ним пользователя из этой же таблицы с заданным id.
Суть же задачи, как я понял, заключается в том, чтобы выбрать пользователей которые добавили в друзья конкретного пользователя, и пользователей, которых добавил в друзья заданный пользователь.

_____________
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
kaww
Цитата (DragonNoir @ 15.03.2016 - 09:40)
Ваш запрос вернет всех пользователей из таблицы User и прилепит к ним пользователя из этой же таблицы с заданным id.

Вообще-то нет. Оба запроса должны вернуть друзей пользователя :id
Т.е. в первом случае запрос получится типа:
select f.*
from users as f
inner join user_friends as uf on uf.user_id=f.id
inner join users as u on u.id=uf.user_friend_id
where u.id = :id


Во втором так полагаю что:
select f.*
from users as f
inner join user_friends as uf on uf.user_id=f.id
where uf.user_friend_id = :id
DragonNoir
Возможно вы и правы. Я ORM Doctrine только начал постигать smile.gif

_____________
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
Bolik
ооо, мою тему обсуждают, спасибо!

я этот запрос переделал, но сейчас нет возможности посмотреть как. вечером попробую все варианты. таблица должна быть довольно большой, так что производительность тут имеет решающее значение.

пока что из пользования доктриной понял, что lazy loading зло, нужно сразу все что нужно выбирать из базы и кешировать как можно больше.
DragonNoir
Цитата
нужно сразу все что нужно выбирать из базы и кешировать как можно больше

В отношении SQL-запросов это не совсем верный подход. У вас может элементарно не хватить памяти для кеша.
А в отношении задачи, если я правильно ее понял, я бы посоветовал разнести по разным таблицам пользователей, их отношения друг с другом и их сообщения. Возможно имеет смысл сделать в мускуле вьюху для вашей выборки, а в коде уже выбирать данные из вьюхи

_____________
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
Bolik
Цитата

В отношении SQL-запросов это не совсем верный подход. У вас может элементарно не хватить памяти для кеша.


тут речь идет не сотнях тысяч строк, для больших списков и пр. есть пагинация.

Цитата

А в отношении задачи, если я правильно ее понял, я бы посоветовал разнести по разным таблицам пользователей их отношения друг с другом и их сообщения.


на счет сообщений само собой, им в таблице Юзер делать нечего. а отношения в принципе так и хранятся в доктрине, через join table. еще есть класс invitation, он тоже в отдельной таблице т.к. пользователь должен подтвердить друг ли к нему стучится или нет.
DragonNoir
Доктрина - всего лишь инструмент. Начинать надо непосредственно с БД. Вы можете показать структуру таблиц, связанных с этой задачей, чтобы дальнейший разговор был более предметным?


_____________
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.