Size: a a a

2019 January 10

П

Павел in Laravel UA
пока решил не элегантным sync, а ручным добавлением в таблицу через attach каждого вхождения песни в плейлист. но возможно, что через sync это и не реализуется, так как я все-таки добавил номер позиции в плейлисте дополнительным столбцом в pivot таблицу
источник

П

Павел in Laravel UA
предварительно делаю detach всех id песен
источник

П

Павел in Laravel UA
и withPivot не нужен в функции belongstoMany, так как attach сам создает sql  записывая playlis_id, song_id, position. А вот при получении соотношения many-to-many eloquent и так достает все столбцы pivot таблицы. Проверил через debugbar
источник
2019 January 13

O

Ostap 🇺🇦 in Laravel UA
Привет люди

Модели
ProductPosition https://pastebin.com/xFCAGA5u
City https://pastebin.com/UVHyqgDi
Region https://pastebin.com/cM82Eghz
# Код:
$product_positions = ProductPosition::with(['city', 'product'])->get();

по идеи, оно должно зайти в таблицу regions, и получить объект city по city_id
но...

вместо этого оно сформировало запрос такой:
select `cities`.*, `regions`.`id` from `cities` inner join `regions` on `regions`.`id` = `cities`.`id` where `regions`.`id` in (1)
и мне кажется все ок, только б убрать
 where `regions`.`id` in (1)
, ведь оно все портит...

Как такое решить?

Буду благодарен...

#ostap_help
источник

O

Ostap 🇺🇦 in Laravel UA
ок, кажется мне тут hasManyThrough не подходит, напишу на джоинах, спс...
источник

O

Ostap 🇺🇦 in Laravel UA
вот что получилось:
$product_positions = ProductPosition::join('regions', 'product_positions.region_id','=', 'regions.id')
           ->join('cities', 'regions.city_id', '=', 'cities.id')
           ->select(['product_positions.*', 'regions.name as region_name', 'cities.name as city_name'])->paginate(15);
источник

YP

Yurii Prudskyi in Laravel UA
Ostap 🇺🇦
Привет люди

Модели
ProductPosition https://pastebin.com/xFCAGA5u
City https://pastebin.com/UVHyqgDi
Region https://pastebin.com/cM82Eghz
# Код:
$product_positions = ProductPosition::with(['city', 'product'])->get();

по идеи, оно должно зайти в таблицу regions, и получить объект city по city_id
но...

вместо этого оно сформировало запрос такой:
select `cities`.*, `regions`.`id` from `cities` inner join `regions` on `regions`.`id` = `cities`.`id` where `regions`.`id` in (1)
и мне кажется все ок, только б убрать
 where `regions`.`id` in (1)
, ведь оно все портит...

Как такое решить?

Буду благодарен...

#ostap_help
Привет. Описывай, плз, словами, что у тебя есть, и что тебе надо сделать, чтоб тебе можно было помочь. Так как может быть ситуация, в которой нужна не твоя первоначальная кверя, а что-то другое, а мы будем пытаться починить кверю. Предположу, что ты просто хочешь получить список всех продукт_позиций с подгруженными городами. Тогда смотри:
1) У тебя релейшн на получения списка городов называется citY, а не citiES. Если ты получаешь список, называй переменную или метод соответствующим образом. Это суперважно. Если б я читал код в своем проекте, в котором релейшн на список городов назван citY, у меня сразу бы сформировалось определенное отношение к его автору :)
2) У тебя какая-то каша в параметрах хэсМэниСру, почитай офф доку, там норм пример ( https://laravel.com/docs/5.7/eloquent-relationships#has-many-through ), показано, где ключ релейтед таблицы, а где дальней.
3) У тебя не совсем стандартная ситуация для хэсМэниСру, стандартная была бы, если б ты из региона получал список всех товарах во всех городах этого региона. Но тогда и база б чуть иначе была бы построена.
В текущей ситуации, если прям очень хочешь подгрузить именно так (а не, например, через region.cities, что проще всего), то выход есть - надо поменять порядок полей в параметрах хэсМэниСру. Как-то так:
public function cities(){

       return $this->hasManyThrough(City::class, Region::class, 'id', 'region_id', 'region_id');
   }
Все, собственно. ProductPosition::with('cities') должно делать то, что ты хочешь.
источник

O

Ostap 🇺🇦 in Laravel UA
Yurii Prudskyi
Привет. Описывай, плз, словами, что у тебя есть, и что тебе надо сделать, чтоб тебе можно было помочь. Так как может быть ситуация, в которой нужна не твоя первоначальная кверя, а что-то другое, а мы будем пытаться починить кверю. Предположу, что ты просто хочешь получить список всех продукт_позиций с подгруженными городами. Тогда смотри:
1) У тебя релейшн на получения списка городов называется citY, а не citiES. Если ты получаешь список, называй переменную или метод соответствующим образом. Это суперважно. Если б я читал код в своем проекте, в котором релейшн на список городов назван citY, у меня сразу бы сформировалось определенное отношение к его автору :)
2) У тебя какая-то каша в параметрах хэсМэниСру, почитай офф доку, там норм пример ( https://laravel.com/docs/5.7/eloquent-relationships#has-many-through ), показано, где ключ релейтед таблицы, а где дальней.
3) У тебя не совсем стандартная ситуация для хэсМэниСру, стандартная была бы, если б ты из региона получал список всех товарах во всех городах этого региона. Но тогда и база б чуть иначе была бы построена.
В текущей ситуации, если прям очень хочешь подгрузить именно так (а не, например, через region.cities, что проще всего), то выход есть - надо поменять порядок полей в параметрах хэсМэниСру. Как-то так:
public function cities(){

       return $this->hasManyThrough(City::class, Region::class, 'id', 'region_id', 'region_id');
   }
Все, собственно. ProductPosition::with('cities') должно делать то, что ты хочешь.
огого, большое спасибо!
источник

YP

Yurii Prudskyi in Laravel UA
нз) Отпиши, получилось ли
источник

O

Ostap 🇺🇦 in Laravel UA
ща буду менять, отпишусь
источник
2019 January 15

П

Павел in Laravel UA
Всем привет. Кто использовал Laravel с вебсокетами? Или Laravel Echo Server или из новых Laravel Websockets. Последний поставил, все прекрасно и сразу заводится. Клиентов пишу и на react-native и просто на node.js. Никак не могу понять, как подписаться на сообщения от клиентов. С сервера через broadcast, а вот где что создать в ларе типа Event. Гуглю уже много часов) Интуиция и обрывки форумов ведут в сторону redis и socket.io. но Laravel Websockets удобен тем, что быстро и просто реализует pusher протокол
источник

П

Павел in Laravel UA
Или по API принимать понятно можно, но мне задержка нужна около пинга
источник

OK

Oleg Khalin in Laravel UA
Павел
Или по API принимать понятно можно, но мне задержка нужна около пинга
Ну настрой на фронте ларавель эхо
источник

П

Павел in Laravel UA
как я понял это просто прокладка над пушером или sockets.io
источник

П

Павел in Laravel UA
мне на бэке надо
источник

OK

Oleg Khalin in Laravel UA
Павел
мне на бэке надо
Что на беке надо?
источник

П

Павел in Laravel UA
получается однонаправленный канал сообщений broadcast
источник

П

Павел in Laravel UA
а я хочу на сервере получать сообщения
источник

П

Павел in Laravel UA
подписаться на клиентов
источник

OK

Oleg Khalin in Laravel UA
С фронта?
источник