У меня нет места для поворота. Я надеюсь, что кто-то здесь укажет мне в правильном направлении.Обработка разговоров с использованием Laravel Eloquent
У каждого пользователя есть строка статистики, в которой содержится их счетчик друзей, количество запросов друзей, количество новых сообщений и количество сообщений. Гораздо быстрее выбрать 1 строку из этой таблицы, а не выполнять большой запрос, полный объединений и т. Д., Чтобы получить статистику пользователей при каждой загрузке страницы.
Проблема заключается в том, что эта строка должна обновляться при каждом новом сообщении разговора. На самом деле это не проблема, если я просто обновляю одну строку. В разговоре может быть несколько участников (например, возьмем 20).
Мне нужно будет обновить 20 строк в таблице статистики. Это считается плохой идеей, так как это вызовет блокировку для других пользователей, делающих запрос. Понятный. Мне нужно будет обновить 20 строк в таблице участников беседы (has_read flag, has_deleted flag и возможно created_at, поскольку участник «повторно установлен» для разговора). Хорошо, поэтому в целом я обновляю 40 строк на каждом новом сообщении ... звучит немного перебор, но это не останавливается на достигнутом.
Обновление строк в красноречиве не просто. Я не знаю, как вы можете сделать насыпное обновление в красноречивы либо так что код заканчивается так:
foreach ($conversation->participants as $participant) {
if ($participant->user_id == Auth::user()->id) {
continue;
}
$participant->has_read = 0;
if ($participant->has_deleted == 1) {
$participant->has_deleted = 0;
$participant->created_at = DB::Raw('NOW()');
}
$participant->save();
$participant->user->stats->new_messages += 1;
$participant->user->stats->save();
}
Так уже, я выступаю по крайней мере 40 запросов. Не говоря уже о том, что пользователь сам не загружается ... не совсем уверен, как можно загружать их в отношениях, поэтому я выполняю по меньшей мере 60 запросов, делая это красноречиво каждый раз, когда отправляется новое сообщение. Я не знаю о вас, но для меня это смущает.
Так что, в основном, я не уверен, как обращаться со всей статистической стороной вещей и массовым обновлением. Мне кажется, что я попал в кирпичную стену, и я не уверен, что делать или куда обратиться. Пожалуйста, помогите, спасибо.