【问题标题】:Get results from pivot table based on the combination of two IDs in Laravel Project根据 Laravel 项目中两个 ID 的组合从数据透视表中获取结果
【发布时间】:2018-05-29 11:12:18
【问题描述】:

大家好,在一个客户的新项目中,我必须为具有流派的书籍制作一个过滤系统。

我已经建立了多对多关系和数据透视表。到目前为止,我已经制作了带有复选框的表单,因为目标是查询两种或多种类型的组合,并仅显示包含所有选定类型的结果。

我的迁移是:

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

我的模型是:

类书扩展模型{ 公共功能流派(){ return $this->belongsToMany('App\Genre', 'book_genre'); } }

这是我的控制器,我在其中获取带有流派 ID 的 Get 数组:

类 FilterController 扩展控制器 { 公共函数索引() { $genreIds = 输入::get('genres'); $books = Book::whereHas('genres', function($q) use ($genreIds){$q->whereIn('genres.id', $genreIds);})->orderBy('created_at', ' desc')->分页(10); } return view('filter.index', compact('books')); }

这里的问题是它不是通过类型组合过滤结果,它只是在它们具有其中一种类型时过滤它们。

我应该更改哪些内容才能仅查询具有所列类型的匹配书籍?

【问题讨论】:

  • 我认为右括号之一在您的控制器中的位置错误。

标签: laravel pivot


【解决方案1】:
$query = Book::with('genres');

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

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

【讨论】:

  • 你是怎么做到的?我几天来一直在寻找答案....您是真正的救星!!!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2017-10-16
  • 1970-01-01
  • 2019-07-25
相关资源
最近更新 更多