在laravel中是否存在一个belongsTo关系?

时间:2019-05-03 13:50:04

标签: php laravel laravel-5 eloquent

示例

角色-> hasMany->用户

如果我想让所有用户都具有特定角色,我通常会这样做:

$role = Role::findOrFail(1);
User::where('role.id', $role->id)->get()

User::where('role_id', $role->id)->get()

我的问题是: 有什么方法可以实现而无需使用role_idid。我只想使用$role对象。 像这样的东西会很棒:

User::where('role', $role)->get();

我知道我可以使用$role->users,但是我将其省略了,因为如果我有多个要查询的belongsTo关系,则不能使用它。

示例

$model->where('otherModel', $otherModel1)->where('differentModel', $differentModel1)->get();

背景

如果您想重命名主键或外键,或者如果您的应用程序具有带有违反直觉的名称的键,那么这样的解决方案将大有帮助。

1 个答案:

答案 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();