我需要将两个查询合并为一个,这样我就可以在我的刀片视图中的一个表中的foreach上调用它一次。我尝试使用merge()
,但它显示两个单独的查询。 CountofPatents
是用户提交的所有专利,CountofApprovedPatents
是status
为“2”的专利。以下是它现在的样子:
数组0 [person_id:1 CountofApprovedPatents:4 状态:2]
数组1 [person_id:2 CountofApprovedPatents:2 状态:2]
数组2 [person_id:1 专利数量:5]
阵列3 [person_id:2 专利数量:4]
这是它应该是什么样子
数组0 [person_id:1 CountofApprovedPatents:4 专利数量:5]
数组1 [person_id:2 CountofApprovedPatents:2 专利数量:4]
到目前为止,这是我的代码
admincontrol上
$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();
您可以在原始选择的列中使用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();
如果当前行的IF
是sum()
,那么1
上面的status
条件会将2
添加到结果中,否则它会添加有效不会破坏总和的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 - 值得一看文档:)