当前位置: 首页 > 知识库问答 >
问题:

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

夏侯弘光
2023-03-14

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

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

我的迁移是:


    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个答案

司寇旺
2023-03-14
$query = Book::with('genres');

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

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

 类似资料:
  • 我有一个熊猫数据帧,比如: 现在,我想计算每个标准箱的每个组/队列的患病人数百分比。 注意,我知道一个单一的聚合,即可能类似于: 一张天真的桌子可能看起来像: 会看起来像: 但这并不适合显示bin的度量()和所有队列()的患病百分比。这怎么能适应呢?也许使用多维聚合? 所需的输出格式: as pivot聚合函数可能会提供扭曲的结果(因为如果每个组的用户数不是常数,则分组平均值的平均值可能不可交换)

  • 问题内容: 我有一个phone_models,phone_problems和一个phone_model_phone_problem数据透视表。数据透视表有一个额外的“价格”列。 手机型号: 电话问题: 我想做的是获取具有特定问题的特定手机的价格。 这就是我现在的方式,但是我觉得Laravel具有内置的Eloquent功能,我找不到用更简单的方式做到这一点: 这一切都是从他们的中选择特定的模型和问题

  • 我有一张这样的桌子 基于以上数据,我需要得到这样一个表 我不知道如何使用一些PIVOT来实现这一点

  • 我正在制作一个VueJS表单,用户可以在其中编辑一个步骤。一个步骤可以有许多父产品。逻辑是一个步骤可以属于多个产品。我有一个名为products、product_step(透视表)和steps的表。 当用户第一次加载页面时,该数组将填充此stap的父产品。 此阵列将根据用户决定在前端执行的操作进行更改。假设他们希望产品n不再具有此步骤的访问权限。在这种情况下,产品将从阵列中删除。 我面临的问题是,

  • 事实上,我的问题很简单,但我找不到任何答案。 我使用的是Laravel Elotent,我有3张桌子: 一个数据透视表叫做: 我已经从我的公司对象中获得了,我正在尝试获取

  • D.1 组合日期数据 前面我们使用地区、城市、产品名称、雇员等字段作为分类字段查看数据汇总信息。那么如果我们按照订单日期做为分类字段来查看汇总信息会是什么样呢?将“订单日期”字段拖动到“行标签”区域,所生成数据透视表如下图所示:此数据透视表显示的是每一天的金额合计,显然不是我们所期望的结果。如果我们希望按照年、季度、月份等来计算金额的汇总信息又该如何实现呢?可以直接在日期字段上单击鼠标右键,选择“