提问者:小点点

在Laravel项目中基于两个ID组合的数据透视表获取结果


嘿,伙计们,在一个新的项目为一个客户,我必须做一个过滤系统的书籍,有体裁。

我做了一个多对多关系和一个透视表。到目前为止,我已经创建了带有复选框的表单,因为目标是查询两个或多个流派的组合,并且只显示具有所有选定流派的结果。

我的迁移是:


    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');
        }
    }

这是我的控制器,我在这里使用带有流派ID的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'));

    }

这里的问题是,它不是通过一个流派的组合来过滤结果,而是简单地过滤它们,如果它们有其中一个流派。

我应该更改什么,这样我就可以只查询出匹配的书,什么有列出的体裁?


共1个答案

匿名用户

$query = Book::with('genres');

foreach($genreIds as $genreId){
    $query->whereHas('genres', function($q) use ($genreId){
        $q->where('id', $genreId);
    });
}
$filteredBook = $query->get();

我在Stackoverflow中找到了相同的解决方案