You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:18:32