Laravel Eloquent:如何在序列化toArray / toJson时自动获取关系

时间:2014-02-05 22:10:01

标签: php laravel laravel-4 eloquent

我认为这可以在我将对象序列化为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();
    }
}

2 个答案:

答案 0 :(得分:39)

使用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();

希望这有帮助!

答案 1 :(得分:4)

我必须提交一个新的答案,因为我是一个SO Pleb。如果您不必使用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'); } } 调用移至您的检索位置。 / p>

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

然后您可以根据需要修改Post调用以预加载:

{{1}}

这样,如果您不需要记录,每次获取记录时都不会包含不需要的数据。