如何根据数据库中条目的状态进行查询和计数?

时间:2019-03-07 14:18:28

标签: php html sql laravel

我有一个名为Patents的表。表值是:

 id | person_id | status | date_submitted | date_approved 

person_id(来自人员表的fk)包含创建专利的人员的id。状态具有2个值为1(待定)或2(已批准)的值。我现在遇到的问题是,我既不能计算已获批准的专利,又不能计算创建专利的人的全部专利。

控制器文件

$start = $request->input('start');
$end = $request->input('end');
$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')
    ->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'));

刀片视图

<thead>
    <tr>
        <th>Person ID</th>
        <th>Patents Approved</th>
        <th>Total Patents</th>
    </tr>
</thead>
<tbody>
    @foreach($results as $result)
      <tr>
        <td>{{ $result->person_id }} </td>
        <td>{{ $result->CountofApprovedPatents }} </td> //Error
        <td>{{ $result->CountofPatents }} </td> //Error
     </tr>
    @endforeach  
 </tbody>

我可以显示$patent->CountofApprovedPatents,但不能显示其他选择。我真的需要帮助,因为我有2个单独的选择,所以我不知道如何获得CountofPatents。我尝试对每个变量进行一次foreach,但它显示的是双重结果,而不是被编译为一行。 $start$end变量只是确定这两个日期之间专利的日期。

2 个答案:

答案 0 :(得分:0)

我可以看到您的控制器中有2个查询,每个查询都生成一个集合。

然后,在刀片文件中,您正在遍历一个集合(不是两个)。

您可能需要在提供以下代码段的控制器中查找用于连接这些数据集的逻辑。

尝试在逻辑的不同点使用dd($ myCollection)来查看数据,然后将其推送到控制器以确保获得期望的结果。

================================================

编辑...我在这里包括了一些代码..这应该可以为您提供所需的内容。 也许有更好的方法来处理集合,但我不确定如何处理大量记录。
这应该可以让您暂时运行。

//setup test
$approvedPatents = collect([
    ['name'=>'andy', 'count'=> 1],
    ['name'=>'joe', 'count'=> 2],
    ['name'=>'william', 'count'=> 5],
]);
$allPatents = collect([
    ['name'=>'andy', 'count'=> 11],
    ['name'=>'joe', 'count'=> 12],
    ['name'=>'william', 'count'=> 15],
]);

//combine collections - basically scan the allpatents collection and get the count from the matching currentpatents collection, and create a new collection entry with both in the combinedpatents collection
$combined = collect();
foreach ($allPatents as $patent) {
    $approvedPatentCount = ($approvedPatents->where('name',$patent['name'])->first())['count'];
    $combined->push([
        'name'=>$patent['name'],
        'allPatentsCount'=>$patent['count'],
        'approvedPatentsCount'=>$approvedPatentCount,
    ]);
}

//display results
foreach ($combined as $c) {
    dump($c);
}

// results from browser
array:3 [▼
  "name" => "andy"
  "allPatentsCount" => 11
  "approvedPatentsCount" => 1
]
array:3 [▼
  "name" => "joe"
  "allPatentsCount" => 12
  "approvedPatentsCount" => 2
]
array:3 [▼
  "name" => "william"
  "allPatentsCount" => 15
  "approvedPatentsCount" => 5
]

答案 1 :(得分:0)

如果您使用的是laravel,则可以使用以下内容:

$zzzz = Model::count();

然后在刀片上致电

{{$zzzz}}