select() 比 get() 更快更省带宽,但必须包含主键(如 id)和时间戳字段(如 updated_at),否则 save()、touch() 等操作会失败;关联查询中需同时 select 外键和关联表主键,pluck()/value() 适用于纯数据提取,select() 才支持模型方法调用。
直接用
指定字段,比用
拿全量字段快,也省带宽——但漏掉主键或关联外键可能让后续操作崩掉。
为什么
后
或
会失败
Eloquent 默认依赖模型实例中存在主键(通常是
)和时间戳字段(
、
)来生成 SQL。如果
里没包含
,调用
时会报
或静默失败。
必须显式包含主键:
如果要调用
或自动更新时间戳,还得带上
(甚至
)
关联预加载(
)不受
影响,但关联模型自身的字段仍需单独指定
和
/
的适用场景区别
返回的是完整模型集合(
),能链式调用
、
,也能继续调用模型方法;
和
返回的是原始值,轻量但不可再操作模型行为。
要后续调用
或
?只能用
并确保含
只取 ID 列表做批量查询?用
更高效
只查单个字段的单行结果?
比
少一次对象实例化
关联查询中怎么安全地限制字段
在
中不能直接传
,得用闭包 +
配合
等关系定义里的字段约束。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
错误写法:
—— 缺少外键(如
)会导致关联失败
正确写法:
,且确保主表查询里包含关联外键字段(如
)
更稳妥的方式:在关系方法里用
预设,比如
字段越少越快,但 Eloquent 不是 SQL 查询器——它始终以“可操作的模型”为前提。漏掉一个
,后面所有模型方法都可能突然失效。
select()get()select()save()update()idcreated_atupdated_atselect()idsave()Call to a member function getKey() on nullselect('id', 'name', 'email')touch()updated_atcreated_atwith()select()select()pluck()value()select()Collectionmap()filter()pluck()value()$user->posts$user->isSubscribed()select()idpluck('id')value('email')select('email')->first()->emailwith()select()select()belongsTo()with(['author' => function ($q) { $q->select('name'); }])user_idwith(['author' => function ($q) { $q->select('id', 'name'); }])select('id', 'title', 'user_id')select()public function author() { return $this->belongsTo(User::class)->select('id', 'name'); }id