Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 20.11.2016 20:08:21

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Связать 3 таблицы

Здравствуйте. Сейчас и в ближайшее время, у меня нет возможности протестировать. По сему хочу спросить у вас.
3 модели Item | User | Offer.
Сейчас Item m2m User. А вот тут уже сам вопрос. Как будит правельнее связать User и Offer m2m или one2m, что бы потом сделать такой запрос PHP$item Item::with('users''users.offers')->find($id); распечатать

PHP
$item->name
@foreach($item->users as $user)
  
$user->name
  
@foreach($user->offers as $offer)
    
$offer-link
  
@endforeach
@endforeach

Если все 3 таблицы связаны m2m, не будит ли это большой нагрузкой на бд при больших обьемах данных?
И вообще, можно ли получить offer если она связана one2m с user, а user связана с item m2m? Потому что когда я последний раз пытался так делать,в relations у меня был null

Не в сети

#2 20.11.2016 21:50:39

Re: Связать 3 таблицы

"Посему" пишется слитно.
"будЕт" пишется через Е, а то будильник.
"правИльно" пишется через И, а то весло.

Может рано программить? В коде подобные ошибки непростительны!

>Если все 3 таблицы связаны m2m

Зависит от задачи, нагрузки, архитектуры и объёма данных. При 100 000 записей в каждой таблице - встанет.

Есть резон дёргать связи БЕЗ ->with(), но дёргать связи там и где нужно.

Потому что 100500 простых Select * FROM table WHERE id=? быстрее/надёжнее, если ты склеишь всё одним-тремя JOIN, который может вывалиться в ошибку по нехватки памяти процессу PHP, бд-то всё похрен, она отдась всё.

Изменено hzone (20.11.2016 21:52:02)

Не в сети

#3 20.11.2016 22:15:00

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать 3 таблицы

hzone пишет:

"Посему" пишется слитно.
"будЕт" пишется через Е, а то будильник.
"правИльно" пишется через И, а то весло.

Может рано программить? В коде подобные ошибки непростительны!

>Если все 3 таблицы связаны m2m

Зависит от задачи, нагрузки, архитектуры и объёма данных. При 100 000 записей в каждой таблице - встанет.

Есть резон дёргать связи БЕЗ ->with(), но дёргать связи там и где нужно.

Потому что 100500 простых Select * FROM table WHERE id=? быстрее/надёжнее, если ты склеишь всё одним-тремя JOIN, который может вывалиться в ошибку по нехватки памяти процессу PHP, бд-то всё похрен, она отдась всё.

Ну да, я делаю ошибки в тексте. Но ведь тут не урок Русского языка, и мы не пишем сочинение.
А за ответ спасибо!
UPD: В коде не пишу на Русском

Изменено TrueKanonir (20.11.2016 22:16:21)

Не в сети

#4 20.12.2016 19:31:52

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать 3 таблицы

Не стал создавать новую тему.
Хотел спросить. На сайте в сайдбаре выводятся все категории с количеством постов на всех страницах сайта. При большом количестве постов, нагрузка на бд будит рости и рости. Думаю добавить колонку posts_count в таблицу с категориями. И тут встал вопрос. Как правильно это сделать? Первое что приходит на ум,это model events. Каждый раз при добавлении нового поста, считать количество постов у категории и заносить результат в posts_count. Или может есть более лаконичный и правильный способ?

Не в сети

#5 23.12.2016 10:18:39

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать 3 таблицы

TrueKanonir пишет:

}%Не стал создавать новую тему.
Хотел спросить. На сайте в сайдбаре выводятся все категории с количеством постов на всех страницах сайта. При большом количестве постов, нагрузка на бд будит рости и рости. Думаю добавить колонку posts_count в таблицу с категориями. И тут встал вопрос. Как правильно это сделать? Первое что приходит на ум,это model events. Каждый раз при добавлении нового поста, считать количество постов у категории и заносить результат в posts_count.  Или может есть более лаконичный и правильный способ?

Ну так как мне поступить в данном случае разумнее? Хотелось бы услышать ваше мнение.

Не в сети

#6 23.12.2016 10:34:34

Re: Связать 3 таблицы

TrueKanonir пишет:

Ну так как мне поступить в данном случае разумнее? Хотелось бы услышать ваше мнение.

поле со счётчиком постов и есть разумнее всего сделать. самому писать обработчики не нужно – всё есть уже готовое

https://github.com/kirkbushell/eloquence#count-cache

Не в сети

#7 23.12.2016 11:30:05

Re: Связать 3 таблицы

Найди в этом разделе тему с названием [РЕШЕНИЕ].
Поможет.
Вообще прими за привычку сначала искать по форуму.
А то испорченный телефон получается.

Не в сети

#8 23.12.2016 12:43:34

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать 3 таблицы

constb пишет:
TrueKanonir пишет:

Ну так как мне поступить в данном случае разумнее? Хотелось бы услышать ваше мнение.

поле со счётчиком постов и есть разумнее всего сделать. самому писать обработчики не нужно – всё есть уже готовое

https://github.com/kirkbushell/eloquence#count-cache

Не знал о таком пакете. Благодарю! То что нужно.

Изменено TrueKanonir (23.12.2016 12:44:14)

Не в сети

#9 23.12.2016 12:45:43

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать 3 таблицы

hzone пишет:

Найди в этом разделе тему с названием [РЕШЕНИЕ].
Поможет.
Вообще прими за привычку сначала искать по форуму.
А то испорченный телефон получается.

Я искал и по форуму, и гуглил. И везде предлагали использовать триггеры или model events. По этому и решил спросить тут.

Не в сети

#10 23.12.2016 13:00:05

Re: Связать 3 таблицы

не, триггеры это перебор. рассматривай поле счётчика как вариант кэша, просто значение хранится сразу в таблице.

подскажу – счётчики комментов, постов и просто просмотров можно хранить прямо в самом кэше, особенно если кэш сделан на редисе и его состояние сохраняется при рестарте системы. всё-таки изменение счётчика – это уже UPDATE, а все операции меняющие данные в БД не самые быстрые (особенно если поле проиндексировано). в то же время редису поменять значение счётчика – это просто изменить несколько байтов в памяти. для высоконагруженных проектов есть смысл в таких оптимизациях.

что касается kirkbushell/eloquence то он на событиях моделей и работает – поэтому там предусмотрены методы принудительного пересчёта, ведь если изменения в таблицы вносятся каким-то другим способом кроме как через модели (например через построитель запросов) – при этом счётчики не будут изменяться и их значения будут становиться неактуальны, имей в виду.

Не в сети

#11 23.12.2016 13:46:45

Re: Связать 3 таблицы

Model events или триггеры требуется сопровождать.
Если готов их сопровождать - молодец, а если "что есть `сопровождать`?", то - "не рано ли"?

Не в сети

#12 23.12.2016 15:29:30

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать 3 таблицы

constb пишет:

не, триггеры это перебор. рассматривай поле счётчика как вариант кэша, просто значение хранится сразу в таблице.

подскажу – счётчики комментов, постов и просто просмотров можно хранить прямо в самом кэше, особенно если кэш сделан на редисе и его состояние сохраняется при рестарте системы. всё-таки изменение счётчика – это уже UPDATE, а все операции меняющие данные в БД не самые быстрые (особенно если поле проиндексировано). в то же время редису поменять значение счётчика – это просто изменить несколько байтов в памяти. для высоконагруженных проектов есть смысл в таких оптимизациях.

что касается kirkbushell/eloquence то он на событиях моделей и работает – поэтому там предусмотрены методы принудительного пересчёта, ведь если изменения в таблицы вносятся каким-то другим способом кроме как через модели (например через построитель запросов) – при этом счётчики не будут изменяться и их значения будут становиться неактуальны, имей в виду.

Спасибо за разъяснение. Пока обойдусь пакетом, ибо проект не особо и нагруженный.

Не в сети

#13 23.12.2016 15:33:55

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать 3 таблицы

hzone пишет:

Model events или триггеры требуется сопровождать.
Если готов их сопровождать - молодец, а если "что есть `сопровождать`?", то - "не рано ли"?

Рано никогда не бывает. Бывает только поздно. И да, готов сопровождать если этого требует задача.

Не в сети

Подвал раздела