как повторно просматривать сообщения, в которых их категория совпадает с текущей записью в laravel?

#laravel #eloquent #laravel-5.8

#laravel #красноречивый #laravel-5.8

Вопрос:

У меня есть связь post и category многие ко многим, где модель post и category определяется правильно, у меня есть сводная таблица, но нет модели для сводной таблицы.

Когда я получаю одно сообщение, у меня есть категории сообщений, $post-> categories . Я хочу перечислить все сообщения с текущими категориями сообщений, например, если текущая публикация имеет категории A и B, я хочу получить все сообщения с категориями A и B. Какой лучший и простой способ в laravel elequent для этой цели?

вот мои модели, если это поможет

 class Post extends Model
{
  public function categories(){
    return $this->belongsToMany(Category::class);
}
}

class Category extends Model
{
  public function posts(){
    return $this->belongsToMany(Posts::class);
}
}

 public function singlePost(Post $post){

    $postsWithSameCategory = ???
   
    return view('home.post',compact('post'));

}
 

Ответ №1:

Если вам нужны сообщения с одинаковыми категориями
Из вашего примера; будут возвращены сообщения с категориями A, B, A / B, A / B / C

  public function singlePost(Post $post){

    $postsWithSameCategory = Post::whereHas('categories', function($query) use ($post) {
        $query->whereIn('id', $post->categories->pluck('id'));
    })->get();
   
    return view('home.post',compact('post', 'postsWithSameCategory'));
}
 

Если вам нужны сообщения с точно такими же категориями
Из вашего примера; Будут возвращены только сообщения с категорией A / B.

  public function singlePost(Post $post){

    $postsWithSameCategory = Post::whereHas('categories', function($query) use ($post) {
        $query->whereIn('id', $post->categories->pluck('id'));
    }, '=', $post->categories->count())->get();
   
    return view('home.post',compact('post', 'postsWithSameCategory'));
}
 

Чтобы также ответить на ваш комментарий, вы можете определить область действия вашей Post модели

 
public function scopeWhereIsRelatedWithPost($query, $post)
{
    return $query->whereHas(/** ... **/);
}

 
 $posts = Post::whereIsRelatedWithPost($post)->get();
 

Комментарии:

1. Чем вы, оба работали, но я в любом случае не понимаю разницы. Есть ли какой-нибудь способ упростить достижение этой цели, например, что-то вроде этого, $post-> categories-> posts

2. Я обновил ответ более простым способом получения сообщений, чем повторение запроса.