你可能不知道的 Laravel Eloquent 小技巧

1. 获取原始属性#

当修改一条 Eloquent 模型记录的时候你可以通过调用 getOriginal() 方法获取记录的原始属性

Copy Highlighter-hljs
$user = App\User::first(); $user->name; //John $user->name = "Peter"; //Peter $user->getOriginal('name'); //John $user->getOriginal(); //原始 $user 记录

2. 检查模型是否被修改#

使用 isDirty() 方法确定模型或给定属性是否已被修改

Copy Highlighter-hljs
$user = App\User::first(); $user->isDirty(); //false $user->name = "Peter"; $user->isDirty(); //true

也可以检查指定属性是否被修改。

Copy Highlighter-hljs
$user->isDirty('name'); //true $user->isDirty('age'); //false

3. 获取更改的属性#

使用 getChanges() 获取更改的属性

Copy Highlighter-hljs
$user->getChanges() //[ "name" => "Peter", ]

注:仅当您使用 syncChanges() 保存模型或同步更新时,才生效

4. 定义 deleted_at 字段#

默认情况下,Laravel 使用 deleted_at 字段处理软删除。 您可以通过定义 DELETED_AT 属性来更改它。

Copy Highlighter-hljs
class User extends Model { use SoftDeletes; * The name of the "deleted at" column. * * @var string */ const DELETED_AT = 'is_deleted'; }

或者定义访问

Copy Highlighter-hljs
class User extends Model { use SoftDeletes; public function getDeletedAtColumn() { return 'is_deleted'; } }

5. 保存模型和关系#

您可以使用 push() 方法保存模型及其关联。

Copy Highlighter-hljs
class User extends Model { public function phone() { return $this->hasOne('App\Phone'); } } $user = User::first(); $user->name = "Peter"; $user->phone->number = '1234567890'; $user->push(); // 这将更新数据库中的用户和电话

6. 重新加载模型#

使用 fresh() 重新从数据库加载一个模型。

Copy Highlighter-hljs
$user = App\User::first(); $user->name; // John // user 表被其他进程修改。 例:数据库又插入一条 “name” 为 “Peter” 的数据。 $updatedUser = $user->fresh(); $updatedUser->name; // Peter $user->name; // John

7. 重新加载现有模型#

你可以使用 refresh() 方法从数据库重新加载具有新值的现有模型。

Copy Highlighter-hljs
$user = App\User::first(); $user->name; // John // user 表被其他进程修改。例: “name” 被修改为 “Peter” 。 $user->refresh(); $user->name; // Peter

注: refresh() 也会更新模型的关联模型数据。

8. 检查模型是否为同一个#

使用 is() 方法确定两个模型是否拥有相同主键并且属于同一张表。

Copy Highlighter-hljs
$user = App\User::find(1); $sameUser = App\User::find(1); $diffUser = App\User::find(2); $user->is($sameUser); // true $user->is($diffUser); // false

9. 克隆一个模型##

你可以使用 replicate() 方法来复制一个模型到一个新的对象中。

Copy Highlighter-hljs
$user = App\User::find(1); $newUser = $user->replicate(); $newUser->save();

10. 在 find() 方法中指定查找的属性##

当使用 find() 或 findOrFail() 方法时,传入第二个参数可以指定需要查找的属性。

Copy Highlighter-hljs
$user = App\User::find(1, ['name', 'age']); $user = App\User::findOrFail(1, ['name', 'age']);

模型属性#

Copy Highlighter-hljs
/** * 为模型指定一个连接名称。 * * @var string */ protected $connection = 'connection-name'; /** * 为模型指定一个表名。 * * @var string */ protected $table = 'users'; /** * 为模型指定主键。 * * @var string */ protected $primaryKey = 'user_id'; /** * 自定义主键类型。 * * @var string */ protected $keyType = 'string'; /** * 如果使用的是非递增或者非数字的主键。 * * @var bool */ public $incrementing = false; class Post extends Model { /** * 加载模型关联数据。 * * @var array */ protected $with = [ 'comments' ]; } public static function delete() { self::whereIn('id', $ids)->delete(); //删除用户 withTrashed() 显示所有数据 onlyTrashed() 显示删除数所 restore()还原数据 } class Post extends Model { /** * 加载模型关联数据数量。 * * @var array */ protected $withCount = [ 'comments' ]; } /** * 执行模型是否自动维护时间戳. * * @var bool */ public $timestamps = false; /** * 可以被批量赋值的属性。 * * @var array */ protected $fillable = ['name', 'age']; /** * 不可被批量赋值的属性,当 $guarded 为空数组时则所有属性都可以被批量赋值。 * * @var array */ protected $guarded = ['price']; guarded 与 fillable,在当前模型中只能存在一者。 /** * 创建时间戳字段名称。 * * @var string */ const CREATED_AT = 'created_at'; /** * 更新时间戳字段名称。 * * @var string */ const UPDATED_AT = 'updated_at'; const STATUS_CREATED = 'created'; /** * 给定字段默认值。 * * @var array */ protected $attributes = [ 'status' => self::STATUS_CREATED, ]; /** * 字段转换为对应的类型。 * * @var array */ protected $casts = [ 'id' => 'integer', 'settings' => 'array', 'is_admin' => 'boolean', ]; /** * 需要转换成日期的属性。 * * @var array */ protected $dates = ['deleted_at']; /** * 模型中日期字段的保存格式。 * * @var string */ protected $dateFormat = 'U'; /** * 追加到模型数组表单的访问器。 * * @var array */ protected $appends = ['is_admin']; /** * 数组中的属性会被隐藏。 * * @var array */ protected $hidden = ['password']; /** * 数组中的属性会被展示。 * * @var array */ protected $visible = ['first_name', 'last_name']; /** * 模型的事件映射。 * * @var array */ protected $dispatchesEvents = [ 'saved' => UserSaved::class, 'deleted' => UserDeleted::class, ]; /** * 指示模型当前是否强制删除。 * * @var bool */ protected $forceDeleting = false; /** * 默认分页数量。 * * @var int */ protected $perPage = 50; /** * 更新添加的关联模型的 updated_at 字段。 * * @var array */ protected $touches = ['post'];
posted @   caibaotimes  阅读(442)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
CONTENTS