#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. Я обновил ответ более простым способом получения сообщений, чем повторение запроса.