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。意思是如果我发送角色 23 我会从角色 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();