Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用ORDER BY获取所有其他字段时使用Laravel_Php_Mysql_Laravel - Fatal编程技术网

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',它将不会提供我想要的功能。