当前位置: 首页 > 知识库问答 >
问题:

Laravel基于子表获取"已完成"行列表

宰父深
2023-03-14

这是我无法解决的问题:
我有一个Clients表和一个box表
每个框属于一个客户端
我需要显示所有客户机,其中完成了属于每个客户机的所有框,这基本上就是where box。status=“已完成”。

我很难掌握如何在一个查询中完成这一切:
-获取所有客户端
-获取属于每个客户端的所有框的计数($总框)
-获取属于每个客户端的完成框的计数($完成框)
-计算如果只显示客户端的位置

我用这个来得到Client.id=2的总计箱的数量

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

我用这个来获得客户的$CompletedBox的数量。id=2

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

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

编辑

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

$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::box的语法不正确。在您引用的链接中,示例是查找(1),但我需要为每个客户机运行它。

再次感谢!

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

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

所以问题是它返回一个客户端,其中任何Box.status=完成。我只需要返回客户端与所有框=完成。在我最初的文章中,应该返回的示例客户端是客户端#2,因为他们的所有框都=已完成。

共有2个答案

朱祺
2023-03-14

首先,在客户机类之间添加一个关系。

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

冯和硕
2023-03-14

试试这个:https://laravel.com/docs/5.8/eloquent-relationships#one-对许多人来说

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

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

在控制器中是这样的:

$clients = Client::all();
return $clients->Boxes()->where('status', 'Completed')->get();
 类似资料:
  • 我有一个物品清单。每个对象都有一个级别属性(int 1、2或3)、一个城市属性(“New York”、“Milan”、“London”)和泛型字符串FamilyID。列表中对象的数量是随机的。我需要创建一个子列表(或任何其他集合/数据结构),它是由列表中的第一个对象组成的,具有级别和城市的任意组合(我不关心FamilyID)。 希望用一个例子让我的要求更清楚: 输出集合是具有(level,City

  • 在上面的示例中,子集列表有23个元素。对于gridSize为12,子集列表中的23个元素应该分布在12个分区中,因此在这种情况下,每个分区应该有2个子集列表中的元素。 这个问题与spring批处理分区有关。列表中的整数实际上是spring批处理程序要处理的用户ID。有些用户比其他用户需要更多的处理时间。因此在分区过程中可能发生的情况是,某些分区可能包含比其他分区占用更多处理时间的更多用户。这会导致

  • 我有两个Laravel雄辩的模型,和,从产品到ProductCategory之间有一个名为的关系。 我已经让模型集合在显示刀片中的循环中迭代,但希望能够根据关系获得产品数量的计数。。。 IE:在集合中20个模型的结果集中,可能有5个电机、5个齿轮箱和5个Acme小部件。我试图找到一种方法来输出作为结果一部分返回的类别列表,以及与每个返回类别相关的记录数。 产品模型 产品类别模型 控制器方法 期望输

  • 我有一个html代码段,如下所示: 如您所见,每个列表元素都包括标记。这对所有元素都是相同的。 这是一个动态创建的列表,id-tag和label文本将有所不同(但数据选择器将始终相同)。 对于Selenium来说,最好的方法是什么来完成这些操作,并列出所有的id标签或标签文本?

  • 我想像下面这样拆分这个字符串: {“我喜欢一个”、“橘子”、“以及”、“苹果”、“但主要是”、“苹果”、“苹果”,“苹果”,“橘子”,“是最好的水果。”} 在上面,我已经拆分了基于水果橙和苹果的字符串,但这两个水果也是子字符串列表的一部分。

  • 尝试使用这个资源:仍然不走运,我如何从Java8 Stream的一些类属性中获得列表?