@geyurgfuyewgfyuguy

Laravel проверить есть ли запись в избранном, как решить проблему?

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

Вот код
DB::table('book')
	->leftJoin('favorite', 'book.id', '=', 'favorite.book_id')
    ->select('book.*', 'favorite.id as favorite_checked')
    ->where([
        ['book.country', '=', $country->id],
        ['book.city', '=', 0],
        ['book.approve', '=', 1],
    ])
    ->where(function($q)
    {
    	if( Auth::check() ) $q->where('favorite.user_id', '=', Auth::user()?->id);
    })
    ->paginate(50);

Нужна исключительно переменная favorite_checked - которая на фронтеде выводит, есть ли в закладках книга или нет.
  • Вопрос задан
  • 452 просмотра
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Вы left join должны ограничивать при присоединении - а не в where.

$user = Auth::user();
DB::table('book')
    ->select('book.*')
    ->where([
        ['book.country', '=', $country->id],
        ['book.city', '=', 0],
        ['book.approve', '=', 1],
    ])
    ->when($user, function($query, $user)
    {
    	  $query->leftJoin('favorite', function($query) use($user){
                 $query->whereColumn('book.id', 'favorite.radio_id')->where('favorite.user_id', '=', $user->id);
          })->addSelect('favorite.id as favorite_checked');

    })
    ->paginate(50);


P.S. А модели вы почему не используете?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jazzus
В Ларавел это делается очень просто с withExists. Можно не писать простыни джоинов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы