Laravel仅使用with返回db的第一个结果

时间:2018-04-04 08:44:48

标签: laravel eloquent laravel-5.6

对于我的API,我需要返回一个具有相应权限的角色。

数据库看起来像: enter image description here

模特角色:

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 2

角色1的权限确实很难恢复,所以主要的问题是为什么我只从数据库中获得第一个结果?

3 个答案:

答案 0 :(得分:2)

当你做的时候:

$role->with('permission')->first()

您实际上在Role模型上运行另一个数据库查询,该模型为您提供第一个角色,无论您实际传递哪个角色。如果你想获得第一个许可,你需要做这样的事情:

$role->permissions->first();

这将加载permissions关系并抓取集合中的第一个项目。正如其他人所建议的那样,如果您需要在已有对象时急切加载关系,则可以使用load方法:

$role->load('permissions');
$firstPermission = $role->permissions->first();

答案 1 :(得分:1)

那是因为$first获取了数据库中的第一条记录。如果您已拥有角色对象,则应将查询更改为以下内容:

$role->load('permissions')

这将eager load权限。

答案 2 :(得分:-1)

因为您使用first()方法,它基本上返回第一个结果 请改用get()来返回集合。