web-dev-qa-db-ja.com

Laravel Eloquent:toArray / toJsonを通じてシリアル化するときにリレーションを自動的にフェッチする方法

オブジェクトをJSONにシリアル化しているときにuserrepliesを自動的にフェッチするためにこれが機能すると思いますが、toArrayをオーバーライドすると、実際にこれを行う適切な方法ですか?

<?php

class Post extends Eloquent
{
    protected $table = 'posts';
    protected $fillable = array('parent_post_id', 'user_id', 'subject', 'body');

    public function user()
    {
        return $this->belongsTo('User');
    }

    public function replies()
    {
        return $this->hasMany('Post', 'parent_post_id', 'id');
    }

    public function toArray()
    {
        $this->load('user', 'replies');
        return parent::toArray();
    }
}
23

toArray()をオーバーライドしてユーザーと返信を読み込む代わりに、_$with_を使用します。

次に例を示します。

_<?php

class Post extends Eloquent
{
    protected $table = 'posts';
    protected $fillable = array('parent_post_id', 'user_id', 'subject', 'body');

    protected $with = array('user', 'replies');


    public function user()
    {
        return $this->belongsTo('User');
    }

    public function replies()
    {
        return $this->hasMany('Post', 'parent_post_id', 'id');
    }

}
_

また、次のように、モデルではなくコントローラでtoArray()を使用する必要があります。

_Post::find($id)->toArray();
_

お役に立てれば!

48
Jake

私はSO plebなので、新しい回答を提出する必要があります。Googleでこれを見つけた人のためにこれを達成するためのより適切な方法は、_protected $with_の使用を避けることです。する必要はなく、代わりにwith()呼び出しを検索に移動します。

_<?php

class Post extends Eloquent
{
    protected $table = 'posts';
    protected $fillable = array('parent_post_id', 'user_id', 'subject', 'body');


    public function user()
    {
        return $this->belongsTo('User');
    }

    public function replies()
    {
        return $this->hasMany('Post', 'parent_post_id', 'id');
    }

}
_

そして、必要に応じてPost呼び出しを変更してプリロードすることができます。

_Post::with('user','replies')->find($id)->toArray();
_

これにより、レコードが不要な場合に、レコードを取得するたびに不要なデータを含めることがなくなります。

5
PaybackTony