Laravel 6 Eloquent - связь между тремя таблицами и опорными точками. - PullRequest
0 голосов
/ 20 января 2020

У меня есть три таблицы, и я хочу связать все 3, но я не знаю, как.

У меня есть таблица для пользователей и еще две для постов и категорий, а также категорий магазинов категорий и подкатегории в той же таблице (с отдельным столбцом типа).

Сообщения и пользователи имеют сводную таблицу, а также сообщения и категории. Но я хочу получать сообщения пользователей по таким категориям, как:

Категория или подкатегория -> Сообщения -> Пользователь

Модель категории:

class Category extends Model
{

    protected $fillable = ['name', 'description', 'type', 'category_id','post_id'];

    public function posts() {

        return $this->belongsToMany(Post::class)->withPivot('post_id');

    }
}

Почтовая модель:

class Post extends Model {

    public function users() {
        return $this->belongsToMany(User::class, 'post_user','post_id', 'user_id')->withTimestamps();
    }


    public function categories() {
        return $this->belongsToMany(Category::class)->withPivot('category_id');
    }

Модель пользователя:


class User extends Authenticatable {

    public function posts() {
        return $this->belongsToMany(Post::class, 'post_user', 'user_id', 'post_id')->withTimestamps();
    }

Тогда в контроллере у меня только это

$posts = Category::with('posts')->get();

Я не знаю, как соотнести эти 3 таблицы. Может быть, мне нужно сделать только одну сводную таблицу между 3 таблицами?

Редактировать: Благодаря Qirel , чтобы помочь мне связать таблицы:

Category::with('posts.users');

Затем я хочу показать только категории, в которых указанный пользователь c имеет сообщения, например что-то вроде

Category::with('posts.users')->where('user.id',1);

Возможно?

1 Ответ

1 голос
/ 21 января 2020

Как обсуждалось в комментариях, это может быть достигнуто с помощью вложенных отношений.

Использование активной загрузки для «предварительной загрузки» реляционных данных с помощью with() и условия отношения с помощью whereHas() с помощью фильтра, который вы хотите, гарантирует, что вы получите записи только там, где есть отношение, соответствующее этому условию - в вашем случае он будет загружать только те категории, в которых указанный пользователь c опубликовал.

$user_id = 1;
Category::with('posts.users')
        ->whereHas("posts.users", function($query) use ($user_id) { 
            $query->where("id", $user_id); 
        })
        ->get();

Вы также можете получить все категории (независимо от того, опубликовал ли предоставленный пользователь или нет), но ограничить реляционные данные только этим пользователем (это означает, что вы получаете все категории, но только сообщения, в которых пользователь с идентификатором 1 является постером). ). Вы можете достичь этого, поставив условие на энергичную загрузку (обратите внимание, что в отличие от использования whereHas() выше, теперь это парный массив ключ / значение).

$user_id = 1;
Category::with(['posts.users' => function($query) use ($user_id) { 
            $query->where("id", $user_id); 
        }])
        ->get();
...