给定下面的表结构,我想返回一个Eloquent集合或者至少将原始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 |
+----+-----------+-------------+
maintenancelog
+----+-------------------+---------+---------------------+
| 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)');
回报
Array
(
[0] => stdClass Object
(
[building_name] => Building 1
[room_name] => Room 1
[maxdate] => 2015-09-13 01:55:59
)
[1] => stdClass Object
(
[building_name] => Building 1
[room_name] => Room 2
[maxdate] => 2015-09-14 03:57:59
)
[2] => stdClass Object
(
[building_name] => Building 2
[room_name] => Room 3
[maxdate] => 2015-09-15 05:59:59
)
是否有给出数组的Laravel辅助函数,我可以指定键和分组命令吗?有点像,按building_name,room_name分组,以便它返回一个集合或关联数组,其中“buildings”和“rooms”作为键,使迭代更容易?我可以建立一个,但这似乎是一个常见的任务. (我做了搜索)
我正在使用Eloquent并为表格制作模型,但查询对我来说太复杂了,无法弄清楚如何将其转换为Eloquent语句.那么即使有一种方法可以使用现有模型创建集合?
(注意我已经弄清楚如何使用关系和查询范围从维护日志 – >房间 – >建筑物向后工作.但它将建筑物置于关系的最低层,我希望它是第一个)
解决方法:
在建筑类:
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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。