【问题标题】:How to query and count based on the status of the entry from the database?如何根据数据库中条目的状态进行查询和计数?
【发布时间】:2019-07-29 11:14:56
【问题描述】:

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

 id | person_id | status | date_submitted | date_approved 

person_id(来自persons 表的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-&gt;CountofApprovedPatents,但不能显示其他选择。我真的需要帮助,我不知道如何获得 CountofPatents,因为我有 2 个单独的选择。我尝试为每个变量做一个 foreach ,但它显示双重结果,而不是在一行中编译。 $start$end 变量只是确定这两个日期之间专利的日期。

【问题讨论】:

    标签: php html sql laravel


    【解决方案1】:

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

    然后在您的刀片文件中,您正在循环一个集合(而不是两个)。

    您可能需要查看下面的控制器,您在其中提供了用于连接这些数据集的逻辑的 sn-p。

    尝试在逻辑的不同点使用 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
    ]
    

    【讨论】:

    • 感谢您的回复。我可以正确查询它们,但只能单独进行。我尝试在上面提供的 foreach 之上添加一个 foreach,即 foreach($totalPatents as $total Patent) {{$totalPatent->CountofPatents}}。我得到了正确的数据,但它创建了另一个表,而不是在 $approvedPatents foreach 的 下
    • 您能否将代码进一步包含在我们的控制器中(合并两个集合的地方)?以及您在哪里调用视图。我认为您的问题可能出在该代码中。
    • 我编辑了代码,我包含了merge()。我尝试 dd($results) 并获得了 CountofApprovedPatents 和 CountOfPatents 值。但我无法访问它。我试图做 {{$results->CountofApprovedPatents}} 但它返回为未定义。它是如何工作的?这是我第一次使用merge()。
    • 我尝试了代码,我在这部分得到'Cannot use object of stdClass as array' /$approvedPatentCount = ($approvedPatents->where('name',$patent['name' ])->first())['count'];/
    • 您的输入可能与我的示例格式不同。您可能需要调整我的示例以匹配您的输入,或者您可以对您的 2 个集合执行 dump() 并从每个集合中发布一些示例,我可以检查一下。
    【解决方案2】:

    如果你使用的是 laravel,你可以这样使用:

    $zzzz = Model::count();
    

    然后在你的刀片上你只需调用

    {{$zzzz}}
    

    【讨论】:

    • 感谢您的回复。但我也试过了,它返回所有专利的总数,而不是与 person_id 关联的专利总数。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签