将两个查询合并为一个查询Laravel

时间:2019-03-11 12:28:43

标签: php mysql sql laravel

我需要将两个查询合并为一个,以便可以在刀片视图中的表中的foreach上一次调用它。我尝试使用merge(),但它显示两个单独的查询。 CountofPatents是用户提交的所有专利,CountofApprovedPatentsstatus为“ 2”的专利。这是现在的样子:

  

array 0 [person_id:1
  批准专利数:4
  状态:2]

     

array 1 [person_id:2
  批准专利数:2
  状态:2]

     

array 2 [person_id:1
  专利数:5]

     

array 3 [person_id:2
  专利数:4]

这就是它的样子

  

array 0 [person_id:1
  批准专利数:4
  专利数:5]

     

array 1 [person_id:2
  批准专利数:2
  专利数:4]

到目前为止,这是我的代码

AdminController

$start = $request->input('start');
$end = $request->input('end');
$approvedPatents = DB::table('patents')
->select('person_id', DB::raw('count(*) as CountofApprovedPatents'))
->where([
    ['status', '=', 2],
    ['date_approved', '>=', $start],
    ['date_approved', '<=', $end],
])
->groupBy('person_id')
->orderBy('status', 'desc')
->get();

$totalPatents = DB::table('patents')
->select('person_id', DB::raw('count(*) as CountofPatents'))
->where([
    ['date_approved', '>=', $start],
    ['date_approved', '<=', $end],
])
->groupBy('person_id')
->orderBy('status', 'desc')
->get();  

$patents = $approvedPatents->merge($totalPatents);
$results = $patents->all();  
return view('admin.patents.showPatents', compact('results', 
'start', 'end'));

是否可以合并这两个查询?

$results = DB::table('patents')
    ->union($approvedPatents)
    ->union($totalPatents)
    ->get();

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是Unions

它允许您指定一个查询,然后将其与最终查询结合起来。

例如。

$first = DB::table('users')
            ->whereNull('first_name');

$users = DB::table('users')
            ->whereNull('last_name')
            ->union($first)
            ->get();

尝试:

$approvedPatents = DB::table('patents')
->select('person_id', DB::raw('count(*) as CountofApprovedPatents, status'))
->where([
    ['status', '=', 2],
    ['date_approved', '>=', $start],
    ['date_approved', '<=', $end],
])
->groupBy('person_id')
->orderBy('status', 'desc')


$totalPatents = DB::table('patents')
->select('person_id', DB::raw('count(*) as CountofPatents'))
->where([
    ['date_approved', '>=', $start],
    ['date_approved', '<=', $end],
])
->groupBy('person_id')
->orderBy('status', 'desc')
->union($approvedPatents)
->get();  

否则,您可能正在寻找Joins-值得看一下文档:)

联盟: https://laravel.com/docs/5.8/queries#unions

加入: https://laravel.com/docs/5.8/queries#joins

答案 1 :(得分:0)

您可以在原始选择的列中使用MySQL的IF condition

$results = DB::table('patents')
->select('person_id', 
          DB::raw('sum(IF(status = 2,1,0)) as CountofApprovedPatents'),
          DB::raw('count(*) as CountofPatents')
->where([
    ['date_approved', '>=', $start],
    ['date_approved', '<=', $end],
])
->groupBy('person_id')
->orderBy('status', 'desc')
->get();

如果当前行的IFsum(),则1中的上述status条件会将2添加到结果中,否则将添加0有效地不会打破总和。