Laravel存在记录但BallByBall模型返回空集合问题求助
BallByBall::get() 返回空集合的问题 嘿,我来帮你定位这个问题!从你提供的 Model 代码和数据库表结构来看,最可能的原因和对应的解决方法如下:
1. 软删除(SoftDeletes)的自动过滤问题(优先级最高)
你在 BallByBall Model 中使用了 SoftDeletes trait,而你的 ball_data 表中 deleted_at 字段的默认值设置为 CURRENT_TIMESTAMP——这就意味着所有新插入的记录都会被自动标记为已删除状态。
Laravel 的软删除机制会自动给所有查询附加 WHERE deleted_at IS NULL 的条件,所以你自然查不到任何记录。
修复方案:
- 修改数据库表结构,将
deleted_at字段的默认值改为NULL,并允许该字段为 null:
ALTER TABLE `ball_data` MODIFY COLUMN `deleted_at` timestamp NULL DEFAULT NULL;
- 如果你根本不需要软删除功能,直接从 Model 中移除
use SoftDeletes;这一行即可,也可以顺便删除表中的deleted_at字段(如果用不上的话)。
2. 确认数据库连接是否正确
有时候我们会不小心连接到错误的数据库(比如本地测试库和线上库搞混),你可以通过以下代码快速验证当前连接的数据库:
dd(\DB::connection()->getDatabaseName());
确认这个数据库中的 ball_data 表确实存在你预期的记录。
3. 检查是否存在全局/本地作用域
如果你的 Model 或者它继承的 BaseModel 被添加了全局作用域,可能会自动过滤掉部分记录。你可以尝试跳过所有全局作用域查询,看看是否能得到结果:
App\Models\BaseModels\BallByBall::withoutGlobalScopes()->get();
如果这样能查到数据,就说明有全局作用域在影响你的查询结果,需要进一步排查作用域的逻辑。
4. 查看实际执行的 SQL 语句
Laravel 可以帮你输出查询实际生成的 SQL,方便对比排查:
$query = App\Models\BaseModels\BallByBall::query(); // 输出SQL语句和绑定的参数 dd($query->toSql(), $query->getBindings());
把生成的 SQL 拿到数据库客户端手动执行,看看是否能返回记录,对比差异就能找到问题所在。
5. 验证主键与字段类型匹配
你的 Model 设置了 protected $primaryKey = 'trans_id';,表中 trans_id 是 int(10) 自增主键,这部分看起来是匹配的,不过如果后续遇到主键相关问题,可以检查是否存在类型不匹配的情况(比如 Model 主键类型与数据库字段类型不一致)。
内容的提问来源于stack exchange,提问作者Vrajesh Doshi

