Php Laravel 5.1从原始数据库(或仅一个数组)创建集合或关联数组

Php Laravel 5.1从原始数据库(或仅一个数组)创建集合或关联数组,php,mysql,arrays,laravel,eloquent,Php,Mysql,Arrays,Laravel,Eloquent,给定下面的表结构,我想返回一个有说服力的集合,或者至少将原始DB结果转换为关联数组,以便于迭代 建筑物 +----+---------------+ | id | building_name | +----+---------------+ | 1 | Building 1 | | 2 | Building 2 | +----+---------------+ +----+-----------+-------------+ | id | room_name | buildin

给定下面的表结构,我想返回一个有说服力的集合,或者至少将原始DB结果转换为关联数组,以便于迭代

建筑物

+----+---------------+
| id | building_name |
+----+---------------+
|  1 | Building 1    |
|  2 | Building 2    |
+----+---------------+
+----+-----------+-------------+
| id | room_name | building_id |
+----+-----------+-------------+
|  1 | Room 1    |           1 |
|  2 | Room 2    |           1 |
|  3 | Room 3    |           2 |
+----+-----------+-------------+
房间

+----+---------------+
| id | building_name |
+----+---------------+
|  1 | Building 1    |
|  2 | Building 2    |
+----+---------------+
+----+-----------+-------------+
| id | room_name | building_id |
+----+-----------+-------------+
|  1 | Room 1    |           1 |
|  2 | Room 2    |           1 |
|  3 | Room 3    |           2 |
+----+-----------+-------------+
维护日志

+----+-------------------+---------+---------------------+
| id | maintenance_value | room_id |      created_at     |
+----+-------------------+---------+---------------------+
|  1 | Cleaned           |       1 | 2015-09-10 00:54:59 |
|  2 | Cleaned           |       1 | 2015-09-13 01:55:59 |
|  3 | Cleaned           |       2 | 2015-09-09 02:56:59 |
|  4 | Cleaned           |       2 | 2015-09-14 03:57:59 |
|  5 | Cleaned           |       3 | 2015-09-08 04:58:59 |
|  6 | Cleaned           |       3 | 2015-09-15 05:59:59 |
+----+-------------------+---------+---------------------+
现在使用以下原始数据库查询

$results = DB::select('
  select b.building_name,r.room_name,x.maxdate FROM buildings b
  join rooms r on r.building_id = b.id
  join (select room_id,max(created_at) as maxdate from maintenancelog group by room_id) x on x.room_id=room.id
  having x.maxdate < DATE_SUB(NOW(), INTERVAL 10 DAY)');
是否有一个Laravel助手函数,在给定数组的情况下,我可以指定键和分组顺序?有点像,按building_name、room_name分组,这样它将返回一个集合或关联数组,其中“buildings”和“rooms”作为键,以使迭代更容易?我可以建造一个,但这似乎是一个共同的任务。(我做了搜索)

我使用的是Elount,并为表创建了模型,但查询太复杂,我无法理解如何将其转换为Elount语句。那么,即使有一种方法可以使用现有的模型创建集合

(注意,我已经了解了如何使用关系和查询范围从维护日志->房间->建筑向后工作。但它将建筑置于关系的最低级别,我希望它位于第一位)

在建筑类中:

public function rooms(){
    return $this->hasMany('App\Room');
}
室内课程:

public function maintenanceLog(){
    return $this->hasMany('App\MaintenanceLog');
}
在MaintenanceLog类中:

public function scopeLongest($query){ //you can name it as you like ofc.
    return $query->orderBy('created_at','desc')->first();
}
最后,您可以使用:

foreach(Building::all() as $building){
    foreach($building->rooms() as $room){
        echo 'building: ' . $building->building_name . ' room: ' . $room->room_name . ' maxdate: ' . $room->maintenanceLog()->longest()->created_at;
    }
}

Laravel提供了一些收集方法,您可以利用这些方法获得所需的数组

为了从$results中获取关联数组,例如

array:3 [
       "Building 1" => "Room 1"
       "Building 1" => "Room 2"
       "Building 1" => "Room 3"
] 
要解决问题,请创建一个集合对象

$collection_obj = collect();
循环浏览$results

foreach ($results as $result) {
            $collection_obj->put($result->building_name, $result->room_name);
}
然后,要将集合转换为数组,请使用toArray()命令

我希望这能解决您的问题,或者至少是为了参考