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

2022-08-30 15:08:34

我认为这适用于自动获取以及当我将对象序列化为JSON时,但是覆盖真的是执行此操作的正确方法吗?userrepliestoArray

<?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();
    }
}

答案 1

不要重写以加载用户和答复,而是使用 。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();

希望这有帮助!


答案 2

我必须提交一个新的答案,因为我是一个SO pleb。对于那些像我一样在Google上找到它的人来说,实现此目的的更正确的方法是避免使用(如果您不必这样做),而是将该调用移动到您的检索中。protected $withwith()

<?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();

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


推荐