Laravel 只有 returns 来自 db 使用 with 的第一个结果
Laravel only returns first result from db using with
对于我的API,我需要return一个具有相应权限的角色。
数据库看起来像:
模特角色:
public function permissions()
{
return $this->belongsToMany( Permission::class );
}
模型权限:
public function roles()
{
return $this->belongsToMany( Role::class );
}
当我使用 RoleController 中的以下函数时:
/**
* Show the form for editing the specified resource.
*
* @param \App\Role $role
* @return \Illuminate\Http\Response
*/
public function edit( Role $role )
{
return response()->json( $role->with('permissions')->first(), 200 );
}
我只从角色中得到第一个结果,即使我发送了一个不同的$role
。意思是如果我发送角色 2
或 3
我会从角色 1
.
得到结果
但是我还检查了 $role
哪个 return 发挥了正确的作用 (2
)
角色 1
的权限 return 很难,所以主要问题是为什么我只能从数据库中获得第一个结果?
那是因为$first
获取了数据库中的第一条记录。如果您已经拥有角色对象,则应将查询更改为以下内容:
$role->load('permissions')
这将 eager load 权限。
因为你使用了first()
方法,这基本上是return第一个结果。
使用 get()
代替 return 集合。
当你在做的时候:
$role->with('permission')->first()
您实际上是 运行 对 Role
模型的另一个数据库查询,它为您提供第一个角色,无论您实际通过哪个角色。如果你想获得第一个权限,你需要做这样的事情:
$role->permissions->first();
这将加载 permissions
关系并获取集合中的第一项。正如其他人所建议的那样,如果您需要在已经有一个对象时预先加载一个关系,您可以使用 load
方法:
$role->load('permissions');
$firstPermission = $role->permissions->first();
对于我的API,我需要return一个具有相应权限的角色。
数据库看起来像:
模特角色:
public function permissions()
{
return $this->belongsToMany( Permission::class );
}
模型权限:
public function roles()
{
return $this->belongsToMany( Role::class );
}
当我使用 RoleController 中的以下函数时:
/**
* Show the form for editing the specified resource.
*
* @param \App\Role $role
* @return \Illuminate\Http\Response
*/
public function edit( Role $role )
{
return response()->json( $role->with('permissions')->first(), 200 );
}
我只从角色中得到第一个结果,即使我发送了一个不同的$role
。意思是如果我发送角色 2
或 3
我会从角色 1
.
但是我还检查了 $role
哪个 return 发挥了正确的作用 (2
)
角色 1
的权限 return 很难,所以主要问题是为什么我只能从数据库中获得第一个结果?
那是因为$first
获取了数据库中的第一条记录。如果您已经拥有角色对象,则应将查询更改为以下内容:
$role->load('permissions')
这将 eager load 权限。
因为你使用了first()
方法,这基本上是return第一个结果。
使用 get()
代替 return 集合。
当你在做的时候:
$role->with('permission')->first()
您实际上是 运行 对 Role
模型的另一个数据库查询,它为您提供第一个角色,无论您实际通过哪个角色。如果你想获得第一个权限,你需要做这样的事情:
$role->permissions->first();
这将加载 permissions
关系并获取集合中的第一项。正如其他人所建议的那样,如果您需要在已经有一个对象时预先加载一个关系,您可以使用 load
方法:
$role->load('permissions');
$firstPermission = $role->permissions->first();