
当 Laravel 模型调用 Model::all() 返回空数组,而原生查询 DB::table('schema.table')->get() 能正常获取数据时,通常是因为模型未正确指定数据库表名(尤其是含 schema 的复合表名)。
当 laravel 模型调用 `model::all()` 返回空数组,而原生查询 `db::table('schema.table')->get()` 能正常获取数据时,通常是因为模型未正确指定数据库表名(尤其是含 schema 的复合表名)。
在 Laravel 中,Eloquent 模型默认会根据类名(蛇形复数)自动推导表名。例如 M_Obat 类默认对应表 m_obats,且不支持自动解析带 schema 前缀的表名(如 master.ruangan)。这正是问题的根本原因:M_Obat::all() 实际查询的是不存在的 m_obats 表(或当前数据库下无该表),因此返回空集合;而 DB::table('master.ruangan')->get() 直接走查询构造器,明确指定了 schema 和表名,故能成功获取 2 条记录。
✅ 正确做法是在模型中显式声明 $table 属性:
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class M_Obat extends Model
{
// 显式指定完整表名(含 schema)
protected $table = 'master.ruangan';
// 可选:禁用自动维护时间戳(若表中无 created_at/updated_at 字段)
public $timestamps = false;
// 可选:若主键非 id 或非自增,需额外配置
// protected $primaryKey = 'ruangan_id';
// public $incrementing = false;
}⚠️ 注意事项:
- Laravel 默认不支持
schema.table格式的表名自动识别,必须通过$table手动赋值; - 确保数据库连接已正确配置并允许访问
masterschema(尤其在 PostgreSQL 或启用 schema 的 MySQL 环境中); - 若使用 MySQL,确认用户权限已授予
master.ruangan表的 SELECT 权限; - 运行
php artisan tinker测试:>>> App\Models\M_Obat::all()应返回预期数据; - 避免在模型中使用
setTable()动态设置——它仅对单次查询生效,无法替代$table的全局声明。
? 总结:Eloquent 模型与数据库表的映射必须显式、准确。遇到 all() 为空但原生查询正常的情况,第一排查点即为模型的 $table 属性是否完整、正确地指向目标表(含必要 schema)。这是 Laravel 开发中常见却易被忽略的基础配置项。











