九個有用的 Laravel Eloquent 的特性

對於使用 Laravel 的開發者來講,可能都會驚歎於 Eloquent Model 的強大,可是在強大的表面之下,其實仍是有不少不爲人知的特性的,本文即來分享十個 Laravel Eloquent 的強大特性。數據庫

1.更強大的 find() 方法
不少開發者在使用 find() 方法的時候,一般就只是在這裏傳入一個 ID 的參數,其實咱們也是能夠傳入第二個參數的:find() 方法中指定須要查找的字段app

$user = App\User::find(1, ['name', 'age']);
$user = App\User::findOrFail(1, ['name', 'age']);
// 這裏面的 name 和 age 字段就是制定只查找這兩個字段

2.克隆 Model
直接使用 replicate() 方法便可,這樣咱們就很容易地建立一個 Model 的副本:this

$user = App\User::find(1);
$newUser = $user->replicate();
$newUser->save();
// 這樣,$newUser 和 $user 的基本數據就是同樣的

3.檢查 Model 是否相同
使用 is() 方法檢查兩個 Model 的 ID 是否一致,是否在同一個表中:code

$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 這個字段來維護的,其實你是能夠自定義這個字段的:get

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

或者你這樣自定義也能夠:string

class User extends Model
{
    use SoftDeletes;
    public function getDeletedAtColumn()
    {
        return 'deleted_date';
    }
}

6.獲取已修改的 Model 屬性
使用 getChanges() 方法獲取已被修改的屬性:io

$user->getChanges()
//[
     "name" => "GeiXue",
  ]

7.檢查 Model 是否被修改
使用 isDirty() 方法就能夠檢測模型中的數據是否被修改:function

$user = App\User::first();
$user->isDirty();          //false
$user->name = "GeiXue";
$user->isDirty();          //true

在使用 isDirty() 的時候,你也能夠直接檢測某個屬性是否被修改:class

$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 項目的時候幫到你一點點。Happy Hacking

相關文章
相關標籤/搜索