首页 文章

根据Laravel Project中两个ID的组合,从数据透视表中获取结果

提问于
浏览
1

嘿伙计在一个客户的新项目中,我必须为具有流派的书籍制作过滤系统 .

我已经 Build 了多对多关系和数据透视表 . 到目前为止,我已经使用复选框创建了表单,因为目标是查询两个或更多类型的组合,并仅显示具有所有选定类型的结果 .

我的迁移是:

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 回答

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

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

相关问题