[Laravel] Eloquentのあまり使われていない便利な機能 10個


あまり使われていなさそうな10個の機能を紹介します。

確認環境

Laravel 6.x

1. 元データの取得

eloquentオブジェクトのデータを変更した後に、getOriginal()で元のデータを取得できます。

use App\User;
$user = App\User::first();

$user->email;                   // nakamura.hanako@example.com

$user->name = "[email protected]";
$user->getOriginal('email');    // nakamura.hanako@example.com

$user->name;                    // yamada.taro@example.com

2. モデルが変更されたかチェック

isDirty()でモデルに変更があったか確認できます。

use App\User;
$user = App\User::first();
$user->isDirty();        // false

$user->email = "[email protected]";
$user->isDirty();        // true

特定の属性が変更されたかも確認できます。

$user->isDirty('email');  // true
$user->isDirty('status'); // false

3. 変更のプロパティを取得

getChangesでDB更新後に変更分を取得できます。

$user->save();

$user->getChanges();
=> [
     "email" => "[email protected]",
     "updated_at" => "2021-05-19 09:58:25",
   ]

wasChangedでDB更新後に変更のあったプロパティを確認できます。(boolean)

$user->save();

$user->wasChanged('email');      // true

$user->wasChanged('status');     // false

$user->wasChanged();             // true

4. カスタム deleted_at

デフォルトで、ソフトディレートは deleted_atカラムが使用されます。これは、DELETED_ATプロパティで変更ができます。

use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
    use SoftDeletes;

     * The name of the "deleted at" column.
     *
     * @var string
     */
    const DELETED_AT = 'is_deleted';
}

またはアクセサでも変更できます。

use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
    use SoftDeletes;

    public function getDeletedAtColumn()
    {
        return 'is_deleted';
    }
}

5. 関連のあるモデルも同時に更新

push()メソッドで変更のあるモデルと、その関連するモデルを同時に更新できます。

class User extends Model
{
    public function user_profile()
    {
        return $this->hasOne('App\UserProfile');
    }
}

use App\User;
$user = User::first();
$user->email = '[email protected]';
$user->user_profile->nickname = 'bob';

$user->push(); // ここで userとuser_profileのレコードがDBに反映されます

6. 更新データを取得

fresh()を使うとDBから更新データを取得できます。

use App\User;
$user = User::first();
$user->email;                    // test30@exmaple.co.jp

## ここでDBのレコードを更新 e.g) emailを"[email protected]"に変更

$updatedUser = $user->fresh();
$updatedUser->email;             // test10@exmaple.co.jp

$user->email;                    // test30@exmaple.co.jp

7. 更新データを既存のモデルに反映

refresh()を使うとDBから更新データを取得し、既存のモデルに反映します。

use App\User;
$user = User::first();
$user->email;                    // test10@exmaple.co.jp

## ここでDBのレコードを更新 e.g) emailを"[email protected]"に変更

$user->refresh();
$user->email;                    // test50@exmaple.co.jp

8. 同一モデルか確認

is()を使うと同一モデルか確認できます。

下記全てが同一なら、同一モデルとして判断されます。
・ID
・参照しているテーブル
・DB接続設定

use App\User;
$user = User::find(1);
$sameUser = User::find(1);
$diffUser = User::find(2);

$user->is($sameUser);       // true
$user->is($diffUser);       // false

9. モデルのコピー

replicate() を使ってモデルをコピーできます。

use App\User;
$user = User::find(1);
App\User {
    email: "[email protected]",
    status: "0",
}
$user->id;    // 1

$newUser = $user->replicate();
App\User {
    email: "[email protected]",
    status: "0",
}
$newUser->email = "[email protected]";
$newUser->save();

$newUser->id;     // 52

10. find() で特定の属性を取得

find() or findOrFail() で特定の属性のみ取得できます。

use App\User;
$user = User::find(1, ['email', 'status']);
# App\User {
#     email: "[email protected]",
#     status: "0",
# }

$user = User::findOrFail(1, ['email', 'status']);
# App\User {
#     email: "[email protected]",
#     status: "0",
# }