Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> вопрос по Doctrine, попинайте запрос
Bolik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 352
Пользователь №: 35724
На форуме: 4 года, 19 дней
Карма: 4




привет,

я в таблице 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 опыта очень мало?

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

спасибо за критику.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
DragonNoir  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 47
Пользователь №: 42691
На форуме: 8 месяцев, 24 дня
Карма: 2




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


--------------------
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 7 дней
Карма: 184




Давно не имел дела с доктриной, но мне кажется, что задача решается примерно так
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
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
DragonNoir  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 47
Пользователь №: 42691
На форуме: 8 месяцев, 24 дня
Карма: 2




Тут вопрос не в доктрине, а в самом запросе. Ваш запрос вернет всех пользователей из таблицы User и прилепит к ним пользователя из этой же таблицы с заданным id.
Суть же задачи, как я понял, заключается в том, чтобы выбрать пользователей которые добавили в друзья конкретного пользователя, и пользователей, которых добавил в друзья заданный пользователь.


--------------------
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 7 дней
Карма: 184




Цитата (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
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
DragonNoir  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 47
Пользователь №: 42691
На форуме: 8 месяцев, 24 дня
Карма: 2




Возможно вы и правы. Я ORM Doctrine только начал постигать smile.gif


--------------------
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Bolik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 352
Пользователь №: 35724
На форуме: 4 года, 19 дней
Карма: 4




ооо, мою тему обсуждают, спасибо!

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

пока что из пользования доктриной понял, что lazy loading зло, нужно сразу все что нужно выбирать из базы и кешировать как можно больше.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
DragonNoir  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 47
Пользователь №: 42691
На форуме: 8 месяцев, 24 дня
Карма: 2




Цитата
нужно сразу все что нужно выбирать из базы и кешировать как можно больше

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


--------------------
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Bolik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 352
Пользователь №: 35724
На форуме: 4 года, 19 дней
Карма: 4




Цитата

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


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

Цитата

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


на счет сообщений само собой, им в таблице Юзер делать нечего. а отношения в принципе так и хранятся в доктрине, через join table. еще есть класс invitation, он тоже в отдельной таблице т.к. пользователь должен подтвердить друг ли к нему стучится или нет.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
DragonNoir  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 47
Пользователь №: 42691
На форуме: 8 месяцев, 24 дня
Карма: 2




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


--------------------
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса