Красноречивые отношения принадлежат ToMany () - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь найти все posts в различных categories.

У меня есть модели Post и Category, связанные belongsToMany() следующим образом:

Пост

public function categories()
{
    return $this->belongsToMany('App\Category');
}

Категория

public function posts()
{
    return $this->belongsToMany('App\Post');
}

Между ними есть сводная таблица category_post, и все работает хорошо сотношения.

У меня проблема в следующем.Когда user просматривает post, я хочу показать связанный posts, и для этого я хочу показать posts, принадлежащие тому же categories, что и post.

ЕслиЯ делаю следующее:

$post = Post::where('slug',$slug)->first();
$relateds = $post->categories->first()->posts()->get();

Я возвращаю сообщения первой category, но эта запись более ассоциируется categories.И мне нужны все сообщения.

Я пробовал с:

$post = Post::where('slug',$slug)->first();
$relateds = $post->categories->get()->posts()->get();

$post = Post::where('slug',$slug)->first();
$relateds = $post->categories->all()->posts()->get();

И несколько похожих вещей, но ни один не работает.

Как правильно это сделать, пожалуйста?

Спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете получить все связанные posts, используя красноречивый метод whereHas() в Post компоновщике.

$post = Post::where('slug',$slug)->first();

$category_ids = $post->categories->pluck('id')->all();

$related = Post::whereHas('categories', function($query) use ($category_ids) {
    $query->whereIn('id', $category_ids);
})->get();

Здесь мы сначала получаем $post.Затем мы получаем все category идентификаторы для $post.

Наконец, мы получаем все posts там, где он имеет category с id, найденным в переменной $category_ids, используя whereHas() метод построителя (за которым следует whereIn() метод запроса).

Надеюсь, это поможет.

...