【问题标题】:Laravel get list of "completed" rows based on child tableLaravel 根据子表获取“已完成”行的列表
【发布时间】:2019-12-24 23:43:10
【问题描述】:

这是我无法弄清楚的问题:
我有一个 Clients 表和一个 Boxes 表。
每个盒子都属于一个客户。
我需要显示属于每个客户端的所有 Box 都已完成的所有客户端,这基本上是 WHERE box.status = "Completed"。

我无法掌握如何在一个查询中完成所有操作:
- 获取所有客户
- 获取属于每个客户端的所有盒子的计数 ($totalBoxes)
- 获取属于每个客户端的已完成框的计数 ($completedBoxes)
- 计算 $completedBoxes = $totalBoxes
- 仅显示 $completedBoxes = $totalBoxes 的客户

我用它来获取 Client.id = 2 的 $totalBoxes 的数量

Client::leftJoin('boxes', 'clients.id','=', 'boxes.clients_id')  
          ->where('clients_id','=',2)  
          ->select('clients.id','boxes.clients_id','boxes.status as status')  
          ->count();  

我用它来获取 Client.id = 2 的 $completedBoxes 的数量

Client::leftJoin('boxes', 'clients.id','=', 'boxes.clients_id')  
          ->where('clients_id','=',2)  
          ->where('boxes.status','=',"Completed")  
          ->select('clients.id','boxes.clients_id','boxes.status as status')  
          ->count();  
if ($completedBoxes == $totalBoxes) {  
   //echo Client row..  
}  

我只是不知道如何在客户端行的主查询/循环中动态执行这些子查询..

例子:

客户 (id)
1
2
3

框(id、client_id、状态)
1,1,加工
2,1,完成
3,2,完成
4,2,完成
5,3,加工
6,3,完成

所以我的预期结果是:

已完成客户列表
-客户2

非常感谢帮助,非常感谢!

编辑

Hey Chin - 非常感谢,这帮助我得到了我需要的东西! 我最终在我的控制器中使用了以下代码,它返回了我想要的结果。但是,在刀片中显示此内容的最佳方式是什么?

$clients = Client::all();

foreach ($clients as $client){
  $active = $client->boxes()
        ->where('status', '!=' ,'Shipping')
        ->select('client_id')
        ->orderBy('client_id')
        ->distinct()
        ->get();
  echo $active;
}

我希望做这样的事情:

$completedClients = Client::boxes()
        ->where('status', '!=' ,'Shipping')
        ->select('client_id')
        ->orderBy('client_id')
        ->distinct()
        ->get();

然后我可以在我的刀片中运行我的循环,但是 Client::boxes 是不正确的语法。在您引用的链接中,示例是 find(1),但我需要它为每个客户端运行。

再次感谢!

编辑 2
嘿,抱歉回复晚了,我注意到最初提出的解决方案没有返回正确的结果这是我最新的代码:

$completed = Client::whereHas('boxes', function (Builder $query) {
                      $query->where('status', '=', 'Shipping');
                    })
                    ->select('id')
                    ->orderBy('id','asc')
                    ->distinct()
                    ->get();

所以问题是它返回了一个任何 Box.status = Completed 的客户端。我只需要返回 ALL Boxes = Completed 的客户。在我原来的帖子中,应该返回的示例客户端是客户端 #2,因为他们的所有盒子 = 已完成。

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    试试这个:https://laravel.com/docs/5.8/eloquent-relationships#one-to-many

    在客户端模型中添加如下内容:

    public function Boxes() {
        return $this->hasMany('App\Box');
    }
    

    在控制器中是这样的:

    $clients = Client::all();
    return $clients->Boxes()->where('status', 'Completed')->get();
    

    【讨论】:

    • 嗯,这行不通。该代码仅在 $clients 是指定的客户端 ID 时才有效。示例代码仅在以下情况下有效:$clients = Client::find(1) 我想遍历所有客户端。
    • 这只是部分代码,可以帮助您上路。如果要循环,请先在所有客户端上执行foreach,然后开始循环
    • 您好,我刚刚更新了我的帖子,我需要它只返回所有框 = 已完成的客户。如果属于客户端的任何 Box 的 Status=Completed,上述解决方案就会返回。谢谢!
    • 然后你需要遍历$clients as $client并使用$client->Boxes()->where('status', 'Completed')->get()获取盒子
    【解决方案2】:

    首先,在Client 和Box 类之间添加一个关系。

    class Client extends Model
    {
        public function boxes()
        {
            return $this->hasMany(Box::class);
        }
    }
    

    然后你可以使用whereDoesntHave查询所有没有任何未完成框的客户端。

    $clients = Client::whereDoesntHave(['boxes' => function ($query) {
        $query->where('status', '!=', 'Completed');
    });
    

    欲了解更多信息:https://laravel.com/docs/5.8/eloquent-relationships#querying-relationship-absence

    【讨论】:

    • 非常感谢,这帮助我得到了我需要的东西!
    • @coderaging 没问题。请尽可能将我的答案标记为正确。 :)
    • 嘿!我刚刚更新了我的帖子,您能帮我解决最后一点吗,我会将其标记为答案并关闭此主题。谢谢!!
    • @coderaging 我不明白你更新的问题是什么。你能澄清一下吗?
    • 是的,我基本上想在刀片中使用此代码$clients = Client::all(); foreach ($clients as $client){ $active = $client->boxes() ->where('status', '!=' ,'Shipping') ->select('client_id') ->orderBy('client_id') ->distinct() ->get(); echo $active; } 此代码在我的控制器中,但我需要在刀片中显示它。我的问题是如何在我的刀片中显示这个循环。我知道我可以将它添加到数组中,但我认为这不是正确的解决方案,加载也需要一段时间。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2017-09-05
    • 1970-01-01
    • 2014-08-15
    • 2015-11-21
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多