在Laravel中基于父项的父项数据添加条件

时间:2018-10-01 01:39:46

标签: php laravel laravel-5 eloquent

我在将查询转换为Laravel Eloquent时遇到问题。 这是查询:

SELECT cat.id,
       reg.title AS region_title,
       reg.region_code,
       catlang.title,
       catlang.description,
       cat.status
FROM categories AS ca
JOIN regions As reg
      ON cat.region_id = reg.id
JOIN category_language_region As catlang
      ON cat.id = catlang.category_id
          AND reg.language_id = catlang.language_id;

这在Postgres中有效,如您所见,我为加入category_language_region reg.language_id = catlang.language_id添加了附加条件。我一直坚持将其转换为Laravel Eloquent Builder。

这是它的架构

  • 表语言:id,代码
  • 表格区域:id,代码,language_id
  • 表类别:id,状态,region_id
  • 表类别语言区域:id,标题,category_id,language_id

这是我尝试过的

$results = Category::with([
    'region' => function($query){
        $query->select('title', 'id', 'region_code', 'language_id');
    },
    'categoryLanguages'
])->select(['categories.*'])
->whereIn('region_id', $region_ids);

但是它返回所有类别语言区域。我需要添加条件以仅选择等于所选category_language_region.language_id的{​​{1}}。

1 个答案:

答案 0 :(得分:0)

您能否根据给定的代码使用查询生成器尝试此解决方案:

DB::table('categories as cat')
->select([
    'cat.id',
    'reg.title as region_title',
    'reg.region_code',
    'catlang.title',
    'catlang.description',
    'cat.status'
])
->join('regions as reg', 'cat.region_id', '=', 'reg.id')
->join('category_language_region as catlang', function($join) {
    $join->on('cat.id', '=', 'catlang.category_id');
    $join->where('reg.language_id', '=', 'catlang.language_id');
});