查不到数据主因是模型与表结构映射不匹配:需显式指定$table、$primaryKey、$incrementing和$keyType,正确配置$fillable、$timestamps及字段命名转换。

模型定义不匹配表结构,查不到数据怎么办
查不到数据十有八九是模型没对上表——不是语法错,而是映射错。Laravel 默认按类名复数推导表名,User 对应 users,Post 对应 posts;一旦表名是 user_info 或 article_master,就必须显式声明:protected $table = 'user_info'。
主键也常被忽略:find(123) 默认查 id 字段,如果实际主键是 uid,得加:protected $primaryKey = 'uid';如果是 UUID,还得配两行:public $incrementing = false 和 protected $keyType = 'string'。
-
$fillable没设好,create()会静默失败或报MassAssignmentException -
$timestamps = false忘关,插入时可能因缺失created_at字段报错 - 字段含下划线(如
last_login_at),Eloquent 自动转成lastLoginAt属性名,直接读$user->last_login_at是 null
where() + get() 还是 find()?选错影响性能和逻辑
find() 只能按主键查,返回单个模型实例或 null;where()->first() 才是通用条件查询入口。where()->get() 返回 Collection,不是数组——想取第一个得用 ->first(),想转数组得 ->toArray(),直接 json_encode($collection) 会出 JSON,但中间多一层对象封装。
批量操作优先走静态方法:User::where('status', 'pending')->update(['status' => 'processing']) 比先 get() 再循环 save() 快得多,且不触发模型事件(除非你明确需要)。
-
findOrFail(123)比find(123)多一层 404 抛出,适合路由绑定场景 -
firstOrCreate(['email' => $email])原子性查+插,避免并发重复插入 -
exists()比count() > 0更轻量,只返回布尔值
关联查询一写就变 N+1,怎么一招封神
N+1 不是“慢”,是“崩”——100 个用户,每个都调 $user->posts,就是 101 次查询。根治办法只有 with() 预加载:User::with('posts')->get() 两条 SQL 解决;嵌套用点号:User::with('posts.comments')->get()。
但别无脑全加:with('posts') 会把所有 posts 全查出来,如果只需要统计数,用 withCount('posts');如果只想要已发布文章,配合 whereHas():User::with(['posts' => function ($q) { $q->where('published', true); }])->get()。
- 关联方法名必须和
with()里的字符串完全一致,大小写敏感 -
load()是延迟加载,适合“大部分时候不用,少数路径才需要”的场景 - 外键字段没加数据库索引(比如
posts.user_id),with()也救不了慢查询
增删改里藏着的坑:create、update、delete 到底谁动了谁
create() 是静态方法,走批量赋值,依赖 $fillable;save() 是实例方法,只更新已修改字段,不校验 $fillable,但会触发 saving 等事件。
update() 静态调用(如 User::where(...)->update(...))绕过模型生命周期,不触发事件、不走访问器/修改器;而 $user->status = 'done'; $user->save() 全流程走通,适合需要日志、自动格式化等场景。
-
destroy(1)和delete()都会触发deleting/deleted事件;where(...)->delete()不触发 - 软删除用
use SoftDeletes,但记得迁移里加$table->softDeletes(),否则deleted_at字段不存在 - 递增/递减用
increment('read_count'),比先查再改再存更安全,避免竞态
with() 再快,没索引的外键 JOIN 仍是全表扫描;cache::remember() 再方便,缓存键没带业务维度(比如用户角色、地域),就会缓存错内容。这些不在模型代码里,但在生产环境决定生死。


















