我有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);
}