如何在Laravel中用SQL查询显示父表及用MySQL查询展示各房间费率
1. 在Laravel框架中使用SQL查询显示父表
方式一:原生SQL查询
通过Laravel的DB门面执行原生SQL,直接查询父表数据:
// 假设父表名为categories $parentTableData = DB::select('SELECT * FROM categories');
方式二:Eloquent ORM(推荐)
先创建对应父表的模型(比如Category.php),再通过模型查询:
// 模型定义(app/Models/Category.php) namespace App\Models; use Illuminate\Database\Eloquent\Model; class Category extends Model { protected $table = 'categories'; // 表名与模型名复数一致时可省略 } // 查询父表所有数据 $parentTableData = \App\Models\Category::all(); // 或使用灵活的查询构造器 $parentTableData = \App\Models\Category::query()->get();
如果需要同时展示父表关联的子表数据,可在模型中定义关联后用with()预加载:
// 在Category模型中定义子表关联 public function products() { return $this->hasMany(Product::class); } // 查询父表并加载关联子表数据 $parentTableWithChildren = \App\Models\Category::with('products')->get();
2. MySQL查询展示每个房间对应的租赁费率
假设你的表结构如下:
rooms表:id(房间ID,主键)、room_number(房间号)等字段room_rates表:id(主键)、room_id(关联房间ID)、rate(费率)、start_date(费率生效起始日期)、end_date(费率生效结束日期)等字段
场景1:显示所有房间与对应的所有费率
用内连接关联两张表,返回所有匹配的房间-费率记录:
SELECT r.id AS room_id, r.room_number, rr.rate, rr.start_date, rr.end_date FROM rooms r JOIN room_rates rr ON r.id = rr.room_id;
场景2:显示每个房间的最新生效费率
如果一个房间存在多时段费率,通过子查询获取每个房间的最新结束日期对应的费率:
SELECT r.id AS room_id, r.room_number, rr.rate, rr.start_date, rr.end_date FROM rooms r JOIN room_rates rr ON r.id = rr.room_id WHERE rr.end_date = ( SELECT MAX(end_date) FROM room_rates WHERE room_id = r.id );
MySQL 8.0+也可用窗口函数实现,逻辑更清晰:
SELECT room_id, room_number, rate, start_date, end_date FROM ( SELECT r.id AS room_id, r.room_number, rr.rate, rr.start_date, rr.end_date, ROW_NUMBER() OVER (PARTITION BY r.id ORDER BY rr.end_date DESC) AS rn FROM rooms r JOIN room_rates rr ON r.id = rr.room_id ) AS ranked_rates WHERE rn = 1;
场景3:显示所有房间(含无费率的房间)
用左连接确保无费率的房间也能被展示,用COALESCE处理空值:
SELECT r.id AS room_id, r.room_number, COALESCE(rr.rate, '无可用费率') AS rate FROM rooms r LEFT JOIN room_rates rr ON r.id = rr.room_id;
你之前分组(GROUP BY)未成功,大概率是直接按房间ID分组后,未对费率字段用聚合函数或子查询匹配,导致返回随机费率值。上述方案通过子查询或窗口函数解决了这个问题。
内容的提问来源于stack exchange,提问作者Muhammad Fahmi
相关产品推荐
相关产品推荐

