在许多toArray()覆盖的许多地方,最大堆栈深度超过了问题



我有2种型号, user departmence 。这两个具有许多彼此之间的关系。当我尝试将关系字段与 toArray((方法内部的模型类中时,我获得了最大堆栈深度超过 error。

部门模型:

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": []
        }
    ]
}

在做自己在做的事情时,您基本上将创建一个将无限期进行的数组。

首先,从两个模型中删除toArray()方法,实际上很少有理由实际覆盖此方法。

要实现想要的目标,您可以在需要时简单地使用((加载关系,例如。

public function show($id)
{
    return User::with('departments')->findOrFail($id);
}

如果您使用的是路由模型绑定或您刚刚检索了模型,则可以使用load(((懒惰的急切加载(:

public function show(User $user)
{
    $user->load('departments');
    return $user;
}

这对我有用:

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

最新更新