Laravel在使用ORDER BY时获取所有其他字段

时间:2017-10-19 13:47:53

标签: 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

因此,公司ABC将多次出现,重复服务,但时间字段会有所不同。

当我执行查询时

 $results = company::query()
->select(company.name, service, time) 
->groupBy(company.name)
->where('service' , '=', 'carwash')
->get();

我得到公司ABC的一个结果,它的服务和时间。这就是我想要的。但是,我希望这个结果也可以显示其他时间。所以,我理想的查询结果将是一个结果,但我可以访问所有的时间,即2:00,4:00,5:00

所以,当我使用像这样的foreach函数时

<div class="items>
foreach($results as $items)
$items->time
</div>

我想循环遍历 - 2:00,4:00,5:00并在视图中显示,作为一个结果,但它理想情况下会一直显示空格。

所以,这是我想要的结果,这就是我使用groupBy的原因

  

公司 ABC ,服务洗车,时间 2:00,4:00,5:00

我不想要像这样的多个结果

  

公司 ABC ,服务洗车,时间 2:00

     

公司 ABC ,服务洗车,时间 4:00

     

公司 ABC ,服务洗车,时间 5:00

1 个答案:

答案 0 :(得分:2)

您在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