3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-02

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

確認環境

Laravel 6.x

1. 元データの取得

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

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

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

$user->name = "yamada.taro@example.com";
$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 = "yamada.taro@example.com";
$user->isDirty();        // true

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

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

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

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

$user->save();

$user->getChanges();
=> [
     "email" => "yamada.taro@example.net",
     "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 = 'test30@exmaple.co.jp';
$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を"test10@example.co.jp"に変更

$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を"test50@example.co.jp"に変更

$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: "yamada.taro@example.net",
    status: "0",
}
$user->id;    // 1

$newUser = $user->replicate();
App\User {
    email: "yamada.taro@example.net",
    status: "0",
}
$newUser->email = "nakamura.taro@exmaple.co.jp";
$newUser->save();

$newUser->id;     // 52

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

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

use App\User;
$user = User::find(1, ['email', 'status']);
# App\User {
#     email: "test30@exmaple.co.jp",
#     status: "0",
# }

$user = User::findOrFail(1, ['email', 'status']);
# App\User {
#     email: "test30@exmaple.co.jp",
#     status: "0",
# }
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?