對於使用Laravel 的開發者來說,可能都會驚嘆於Eloquent Model 的強大,但是在強大的表面之下,其實還是有很多鮮為人知的特性的,本文即來分享十個Laravel Eloquent 的強大特性。
1.更強大的find() 方法
很多開發者在使用find()
方法的時候,通常就只是在這裡傳入一個ID 的參數,其實我們也是可以傳入第二個參數的:在find()
方法中指定需要尋找的欄位
$user = App\User::find(1, ['name', 'age']); $user = App\User::findOrFail(1, ['name', 'age']); // 这里面的 name 和 age 字段就是制定只查找这两个字段
2 .克隆Model
直接使用replicate()
方法即可,這樣我們就很容易地建立一個Model 的副本:
$user = App\User::find(1); $newUser = $user->replicate(); $newUser->save(); // 这样,$newUser 和 $user 的基本数据就是一样的
3.檢查Model是否相同
使用is()
方法檢查兩個Model 的ID 是否一致,是否在同一個表中:
$user = App\User::find(1); $sameUser = App\User::find(1); $diffUser = App\User::find(2); $user->is($sameUser); // true $user->is($diffUser); // false
4.在關聯模型中同時保存資料
使用push()
你可以在保存模型資料的同時,將所關聯的資料也保存下來:
class User extends Model { public function phone() { return $this->hasOne('App\Phone'); } } $user = User::first(); $user->name = "GeiXue"; $user->phone->number = '1234567890'; $user->push(); // 最后这一行 push() 会将 user 的数据和 phone 的数据同时更新到数据库中
5.自訂deleted_at 欄位
如果你使用過Laravel 的軟刪除Soft Delete 的話,你應該就知道其實Laravel 在標記一個記錄為已刪除的狀態其實是用deleted_at
這個欄位來維護的,其實你是可以自訂這個欄位的:
class User extends Model { use SoftDeletes; * The name of the "deleted at" column. * * @var string */ const DELETED_AT = 'deleted_date'; }
或你這樣自訂也可以:
class User extends Model { use SoftDeletes; public function getDeletedAtColumn() { return 'deleted_date'; } }
6.取得已修改的Model 屬性
#使用getChanges()
方法取得已修改的屬性:
$user->getChanges() //[ "name" => "GeiXue", ]
7.檢查Model 是否已修改
使用isDirty()
方法就可以偵測模型中的資料是否被修改:
$user = App\User::first(); $user->isDirty(); //false $user->name = "GeiXue"; $user->isDirty(); //true
在使用isDirty()
的時候,你也可以直接偵測某個屬性是否被修改:
$user->isDirty('name'); //true $user->isDirty('age'); //false
8.取得Model 的原始資料
在給予Model 的屬性新值的時候,可以透過getOriginal()
來取得原來的值:
$user = App\User::first(); $user->name; //JellyBool $user->name = "GeiXue"; //GeiXue $user->getOriginal('name'); //JellyBool $user->getOriginal(); //Original $user record
9.刷新Model 的數據
使用refresh()
刷新Model 的數據,這在你使用tinker
的時候特別有用:
$user = App\User::first(); $user->name; // JellyBool // 这个时候在其他地方,该用户的名字被更新为 GeiXue,你可以使用 refresh 来刷新,而不用退出 tinker $user->refresh(); $user->name; // GeiXue
最後
上面的九個Eloquent 特性其實在特定的應用場景是非常有用的,希望能在你開發Laravel 專案的時候幫到你一點點。