Php 使用ORDER BY获取所有其他字段时使用Laravel
我有一张这样的桌子Php 使用ORDER BY获取所有其他字段时使用Laravel,php,mysql,laravel,Php,Mysql,Laravel,我有一张这样的桌子 company service time ABC carwash 2:00 ABC carwash 4:00 ABC carwash 5:00 ABC repair 6:00 DEF repair 8:00 <div class="items> foreach($results
company service time
ABC carwash 2:00
ABC carwash 4:00
ABC carwash 5:00
ABC repair 6:00
DEF repair 8:00
<div class="items>
foreach($results as $items)
$items->time
</div>
因此,ABC公司将出现多次,重复服务,但时间字段将不同
当我执行查询时
$results = company::query()
->select(company.name, service, time)
->groupBy(company.name)
->where('service' , '=', 'carwash')
->get();
我为ABC公司得到了一个结果,那就是服务和时间。这就是我想要的。但是,我希望这个结果也能在其他时间显示出来。因此,我理想的查询结果是一个结果,但我可以随时访问,即2:00、4:00、5:00
所以,当我像这样使用foreach函数时
company service time
ABC carwash 2:00
ABC carwash 4:00
ABC carwash 5:00
ABC repair 6:00
DEF repair 8:00
<div class="items>
foreach($results as $items)
$items->time
</div>
在MySQL中需要的查询是:
mysql> SELECT company, service, GROUP_CONCAT(time)
FROM companies GROUP BY company, service;
+---------+---------+--------------------+
| company | service | group_concat(time) |
+---------+---------+--------------------+
| ABC | carwash | 2:00,4:00,5:00 |
| ABC | repair | 6:00 |
| DEF | repair | 8:00 |
+---------+---------+--------------------+
3 rows in set (0.00 sec)
要在Laravel中实现这一点,您需要DB::raw
:
$results = Company::select(DB::raw('company.name, service, group_concat(time)'))
->where('service' , '=', 'carwash')
->groupBy('company.name')
->get();
您可能希望为分组结果添加别名,以便轻松访问它们:
$results = Company::select(DB::raw('company.name, service, group_concat(time) AS times'))
然后您可以使用$results->times
在MySQL中需要的查询是:
mysql> SELECT company, service, GROUP_CONCAT(time)
FROM companies GROUP BY company, service;
+---------+---------+--------------------+
| company | service | group_concat(time) |
+---------+---------+--------------------+
| ABC | carwash | 2:00,4:00,5:00 |
| ABC | repair | 6:00 |
| DEF | repair | 8:00 |
+---------+---------+--------------------+
3 rows in set (0.00 sec)
要在Laravel中实现这一点,您需要DB::raw
:
$results = Company::select(DB::raw('company.name, service, group_concat(time)'))
->where('service' , '=', 'carwash')
->groupBy('company.name')
->get();
您可能希望为分组结果添加别名,以便轻松访问它们:
$results = Company::select(DB::raw('company.name, service, group_concat(time) AS times'))
然后您可以使用$results->times
我在这里发现的问题是,您使用的是group by company.name,因此结果查询将对ABC中service=carwash的所有行进行分组注意,当存在其他非聚合列时,SQL不允许按单个列进行分组。然而,MySQL可能允许您通过适当的设置来实现这一点。在您的案例中,执行选择(“company.name”、“service”、\DB:raw(“GROUP\u CONCAT(time)”)
可能有效,但不是最佳解决方案。laravel中的最佳解决方案是将Elount与模型和关系结合使用。我想搜索一项服务,并获取拥有这些服务的公司名称。如果我使用where company.name='ABC',它将不会提供我想要的功能。我在这里发现的问题是,您使用的是group by company.name,因此结果查询将对ABC的所有行进行分组,其中service=carwash请注意,当存在其他未聚合的列时,SQL不允许按单个列进行分组。但是,MySQL可能允许您通过正确的设置进行分组。在您的情况下,执行选择(“company.name”,“service”,“DB:raw”(“group\u CONCAT(time)”)
可能有效,但不是最佳解决方案。laravel中的最佳解决方案是将Elount与模型和关系结合使用。我想搜索一项服务,并获取拥有这些服务的公司名称。如果我使用where company.name='ABC',它将不会提供我想要的功能。