Igor
Есть какая-то принципиальная разница между использованием hasOne('ModelName') и ModelName::find($this->SomeID)?
Есть. В первом случае у тебя отношение, в другом случа просто выборка из таблицы и N+1 проблема
K
поясните плз как работает createOrupdate или как заюзать createMany вместе с on duplicate key ignore. Необходимо создавать, если нет записи, либо обновлять им updated_at либо игнорить на карйняк ?
Сергей
Есть. В первом случае у тебя отношение, в другом случа просто выборка из таблицы и N+1 проблема
Длинные связки джойнятся на уровне SQL при использовании связей?
K
Первый параметр принимает where, второй update значения
а если записей нет, тогда создастся с параметрами where ?
Oleh
Могу ошибаться конечно
Oleh
Но вроде бы да
Oleh
Загляни в этот метод
Айбек
а если записей нет, тогда создастся с параметрами where ?
со всеми параметрами, два массива merge в один
K
благодарю
Сергей
нет, если хочешь джойнить - делай ручками.
Тогда в чем заключается проблема N+1?
Igor
Тогда в чем заключается проблема N+1?
ну когда ты у каждого объекта вызываешь вместо отношений find у тебя на каждый объект будет нновый запрос
Сергей
А то есть если я иду по списку комментариев и вызываю $comment->Post->Author у меня не происходит ннскольких запросов к таблице Post?
Igor
ну в случае find идут несколько запросов на итерацию цикла а в случае отношений можно их загрузить жадной загрузкой
Igor
https://laravel.com/docs/5.6/eloquent-relationships#eager-loading https://laracasts.com/search?q=eager+loading
Anonymous
Подскажите, как можно взять сущность с 3 связанными сущностями.. То есть допустим 10 постов и взять 3 комента для каждого поста
Vladimir
Post::with(‘comments’ => function($q){$q->take(3);})->paginate(10)
Anonymous
Post::with(‘comments’ => function($q){$q->take(3);})->paginate(10)
так получается всего 3 записи, а надо для каждого поста по 3
Айбек
лимит для связей не работает
Vladimir
Paginate(10) это 10 постов
Anonymous
лимит для связей не работает
и как решить эту проблему?
Anonymous
Paginate(10) это 10 постов
при чем здесь 10 постов? надо 3 комента для каждого поста взять, этот же вариант берет 3 комента всего
Anonymous
select * from `comments` where `comments`.`post_id` in ('4', '5', '50') limit 3
Anonymous
то есть такой запрос делает
Anonymous
а в бд это вообще реально 1 запросом сделать?
Vladimir
Ну замени пагинайт на гет получишь все посты с тремя комментами в каждом
Anonymous
Ну замени пагинайт на гет получишь все посты с тремя комментами в каждом
да не будет там 3 комента в каждом, в этом и проблема
Anonymous
мне нахрен не нужно лимит постов делать, я же тебе говорю, что этот запрос делает 3 комента для всех постов
Anonymous
не для каждого
Anonymous
https://stackoverflow.com/questions/43097559/laravel-eloquent-limit-results-for-relationship
Anonymous
Нашел только такой бредовый вариант, если записей много он не катит
Vladimir
счас проверю свой вариант
Anonymous
Я так понимаю в цикле херачить и кэшировать придется
Anonymous
Для каждого поста
Vladimir
прервали сейчас возвращаюсь, не ту таблицу выбрал там многие ко многим бфли
Anonymous
https://www.reddit.com/r/laravel/comments/33ebck/limiting_eager_loading/
Anonymous
Да вот тема по этой задачке
Vladimir
ага сработало как только для первой ну сзначит попробую в модели пошелудить
Anonymous
ага сработало как только для первой ну сзначит попробую в модели пошелудить
не для первой, а всего выбирается 3 записи понимаешь? Просто на другие не хватает..
Vladimir
ну да она второй запрос преобразует в бред select * from articles where articles.name_id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) limit 2
Владимир
Народ, разбирается кто в nginx? Сейчас он определяет что нужно дергать файл через пхп фпм так - location ~ \.php$ Как мне написать, что нужно дергать все файлы .php , но не по урлу /media?
Maksim (Ellrion)
не для первой, а всего выбирается 3 записи понимаешь? Просто на другие не хватает..
В твоей задаче дело даже не в орм. Ты попробуй ее и на чистом sql решить. Там тоже нифига не тривиально это
Maksim (Ellrion)
Ну не единственное. У тебя бд какая?
Anonymous
а на какой это можно сделать нормально
K
никак не пойму как updateOrCreate может возвращать ERROR: duplicate key value violates unique constraint если он и должен с этим бороться
dmi
никак не пойму как updateOrCreate может возвращать ERROR: duplicate key value violates unique constraint если он и должен с этим бороться
ну у тебя стоит уник на поле которе не праймари кей. и ты пытаешься его вставить.....
dmi
такое же
Maksim (Ellrion)
Можешь взять залоадить только id связанных записей. Это изи. Потом пройти по ним взяв только не более трёх и уже залоадить жаднолениво с условием на whereKeys Телодвижений много но эффективнее чем цыкл и кэш
K
такое же
и как быть?) составной праймери?
Maksim (Ellrion)
то есть при добавлении комента нового привязывать его если в отдельной таблице?
На структуру и связи не влияет алгоритм. Это только стратегия выборки
dmi
и как быть?) составной праймери?
$user = User::find($id); if(!$user){ $user = new User(); }
Maksim (Ellrion)
Ща до компа доберусь кину пример.
Anonymous
Ща до компа доберусь кину пример.
ты хочешь чтобы я все коменты сразу выбрал?
Anonymous
айдишники
Maksim (Ellrion)
Да, только их ид
Anonymous
Да, только их ид
ну так у меня их сотни тысяч
K
$user = User::find($id); if(!$user){ $user = new User(); }
мне нужно одним запросом, а в этом примере сначала поиск, потом создание
Maksim (Ellrion)
Для 10 постов? Ты льстишь своей системе)
Anonymous
Для 10 постов? Ты льстишь своей системе)
ну во первых их будет 50.. А во вторых да, там на каждую запись примерно коментов 300 получается
Maksim (Ellrion)
ну во первых их будет 50.. А во вторых да, там на каждую запись примерно коментов 300 получается
ты хочешь сказать что такая мелочь как выбрать даже 15к id будет дороже 50 запросов в бд?
dmi
мне нужно одним запросом, а в этом примере сначала поиск, потом создание
но вообще посмотри как работает updateOrCreate. там внутри так же... вначале запрос на существование, а потом обновление... это всего лишь сахар...
Anonymous
ты хочешь сказать что такая мелочь как выбрать даже 15к id будет дороже 50 запросов в бд?
кстати а куда лучше выносить такие вот штуки подальше от контроллера?
dmi
ой, Николаю хотел ответить 🙂
Anonymous
ой, Николаю хотел ответить 🙂
ну а какой выход если к примеру было бы 100000 записей ) Серьезно, давайте подумаем глобально
Anonymous
Просто интересно что в таких случаях делать если не в цикле запросы херачить
dmi
блин, я честно говоря ток присоеденился к разговору)) и не читал с чгео вы начали )
Anonymous
Ребята подскажите мне, как изменить версию php в kali?