Laravel - Как получить данные из таблицы, связанной с сводной таблицей - PullRequest
0 голосов
/ 06 мая 2018

У меня есть эта модель для notifications таблицы:

class Notification extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'notification_user', 'notification_id', 'user_id');
    }
}

И этот метод в контроллере для получения данных из notifications, где идентификатор notifications связан с сводной таблицей с именем notification_user:

$myNotifications = DB::table('notification_user')
            ->join('notifications', 'notifications.id', 'notification_user.notification_id')
            ->where('notification_user.user_id', $userId)
            ->where('notification_user.seen', 0)
            ->get();

результат $myNotifications правильный, но я хочу использовать Model и его соотношение вместо DB.

Как я могу получить все записи в notifications, где каждое уведомление относится к определенному пользователю, который пользователь не видит.

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Вам необходимо добавить ->withPivot('seen') к отношению:

public function users()
{
    return $this
        ->belongsToMany(User::class, 'notification_user', 'notification_id', 'user_id')
        ->withPivot('seen');
}

Тогда вы можете сделать:

Notification::whereHas('users', function ($q) use ($userId) {
    $q->where('id', $userId)->where('seen', 0);
})->get();

Чтобы не присоединяться к пользователям, вы можете использовать whereExists :

Notification::whereExists(function ($q) use ($userId) {
    $q
        ->selectRaw(1)
        ->table('notification_user')
        ->whereRaw('notifications.id = notification_user.notification_id')
        ->where('user_id', $userId)
        ->where('seen', 0);
})->get();

Должен быть еще более производительным, но не намного более элегантным.

0 голосов
/ 07 мая 2018

Вы можете использовать с ключевым словом для быстрой загрузки внутри вашего контроллера.например, если у вас есть какое-либо отношение, определенное внутри вашей модели, просто добавьте with ('modelRelation') перед выражением get () в eloquent.

Happy Coding.

0 голосов
/ 06 мая 2018

Вам необходимо определить такое же отношение в пользовательской модели, как и notifications, а затем:

$notifications = User::where('id', $user_id)->notifications()->where('seen', 0)->get();
...