猿问

多对多 toArray() 覆盖中的最大堆栈深度超出问题

我有 2 个模型,用户和部门。这两者之间有着多对多的关系。当我尝试在 Model 类中将字段与toArray()方法相关联时,出现最大堆栈深度超出错误。


部门型号 :


class Department extends Model

{

    public function users()

    {

        return $this->belongsToMany(User::class);

    }


    public function toArray()

    {

        $arr = parent::toArray();

        $arr['users'] = $this->users;

        return $arr;

    }

}

用户模型:


class User extends Model

{

    public function departments()

    {

        return $this->belongsToMany(Department::class);

    }


    public function toArray()

    {

        $arr = parent::toArray();

        $arr['departments'] = $this->departments;

        return $arr;

    }

}

拥有这种 JSON 输出的正确方法是什么?


/api/部门:


{

    "success": true,

    "data": [

        {

            "id": 1,

            "caption": "asd",

            "status": "active",

            "users": []

        }

    ]

}

/api/用户:


{

    "success": true,

    "data": [

        {

            "id": 1,

            "username": "asdasd",

            "email": "m@m.m",

            "status": "active",

            "departments": []

        }

    ]

}


开满天机
浏览 133回答 2
2回答

慕容708150

这对我有用:public function with($id, $relations, $columns = ['*']){    $query = $this->model->newQuery();    $query = $query->with($relations);    return $query->find($id, $columns);}

互换的青春

在做你正在做的事情时,你基本上要创建一个可以无限期运行的数组。首先,toArray()从两个模型中删除方法,实际上几乎没有理由覆盖此方法。为了实现您想要的,您可以在需要时使用with()简单地加载关系,例如public function show($id){    return User::with('departments')->findOrFail($id);}如果您正在使用路由模型绑定或者您刚刚检索了模型,您可以使用load()(延迟预加载)代替:public function show(User $user){    $user->load('departments');    return $user;}
随时随地看视频慕课网APP
我要回答