示例
角色-> hasMany->用户
如果我想让所有用户都具有特定角色,我通常会这样做:
$role = Role::findOrFail(1);
User::where('role.id', $role->id)->get()
或
User::where('role_id', $role->id)->get()
我的问题是:
有什么方法可以实现而无需使用role_id
或id
。我只想使用$role
对象。
像这样的东西会很棒:
User::where('role', $role)->get();
我知道我可以使用$role->users
,但是我将其省略了,因为如果我有多个要查询的belongsTo关系,则不能使用它。
示例
$model->where('otherModel', $otherModel1)->where('differentModel', $differentModel1)->get();
背景
如果您想重命名主键或外键,或者如果您的应用程序具有带有违反直觉的名称的键,那么这样的解决方案将大有帮助。
答案 0 :(得分:0)
User::where('role', $role)->get();
您无法做到或直接实现。这是因为您正在将列(role
)与孔对象进行比较。您可以定义Local Scopes。
我知道我可以使用$ role-> users,但是我将其省略了,因为如果我有多个要查询的belongsTo关系,则不能使用它。
实际上,在这种情况下,您不是利用belongsTo()
关系,而是利用hasMany()
关系(相反)。同样,您可以创建Local Scopes,以便继续限制查询以获取符合您条件的用户。
在问题最后一部分中建议使用自定义列/值搜索的示例:
/** User.php */
public function hasRoleScope($query, $column, $value)
{
return $query->where("role.{$column}", '=', $value);
}
那么你可以做:
/** AnyController.php */
User::has_role('name', 'admin')->get();
// equivalent to: User::where('role.name', '=', 'admin)->get();
您可以继续定义另一个:
/** User.php */
public function scopeActive($query, $value)
{
return $query->where('active', $value);
}
那么你可以做:
/** AnyController.php */
User::active(true)->get();
// equivalent to: User::where('active', true)->get();
有趣的部分?您可以合并范围:
/** AnyController.php */
User
::active(false)
->has_role('id', 23)
->get();