将两个查询合并到一个查询Laravel中

问题描述 投票:0回答:2

我需要将两个查询合并为一个,这样我就可以在我的刀片视图中的一个表中的foreach上调用它一次。我尝试使用merge(),但它显示两个单独的查询。 CountofPatents是用户提交的所有专利,CountofApprovedPatentsstatus为“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();
php mysql sql laravel
2个回答
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


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

© www.soinside.com 2019 - 2024. All rights reserved.