Привет, ребята. В новом проекте для клиента я должен создать систему фильтрации для книг, имеющих жанры.
Я сделал много-много взаимосвязей и сводную таблицу.До сих пор я сделал форму с флажками, потому что цель состоит в том, чтобы запросить комбинацию из двух или более жанров и показать только результаты, которые имеют все выбранные жанры.
Мои миграции:
Schema::create('genres', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 40);
$table->timestamps();
});
Schema::create('books', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 125);
$table->timestamps();
});
Schema::create('book_genre', function (Blueprint $table) {
$table->increments('id');
$table->integer('genre_id')->unsigned();
$table->foreign('genre_id')->references('id')->on('genres')->onDelete('cascade');
$table->integer('book_id')->unsigned();
$table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
$table->timestamps();
});
Моя модель:
class Book extends Model{
public function genres(){
return $this->belongsToMany('App\Genre', 'book_genre');
}
}
Это мой контроллер, где я беру массив Get с идентификаторами жанров:
class FilterController extends Controller
{
public function index()
{
$genreIds = Input::get('genres');
$books = Book::whereHas('genres', function($q) use ($genreIds){$q->whereIn('genres.id', $genreIds);})->orderBy('created_at', 'desc')->paginate(10);
}
return view('filter.index', compact('books'));
}
Здесьпроблема заключается в том, что он не фильтрует результаты по комбинации жанров, а фильтрует их просто, если у них есть один из жанров.
Что я должен изменить, чтобы я мог запрашивать только те книги, которые соответствуютперечисленные жанры?