我正在尝试在唯一验证规则中添加其他where子句。但在此之前,我需要与其他表联系。但我没有成功。
我有2个表:
带有id和name字段
使用role_id,user_id和team_id这三个关键。
所以我需要检查teams.name字段对于一个特定用户是否是唯一的。我试过这个:
'name' => Rule::unique('teams')->where(function ($query){
//return $query->where('account_id', 1);
return $query->join('role_user', 'role_user.team_id', '=', 'teams.id')->where('role_user', Auth::user()->id);
});
我知道问题在于加入,但我不知道如何解决它。谢谢!
高级加入条款中的Look at the documentation
$query->join('role_user', function ($join) {
return $join->on('role_user.team_id', '=', 'teams.id')->on('role_user', '=', Auth::id());
});
这似乎是Laravel在完成对DB的实际查询之前处理QueryBuilder对象的错误。打印查询日志表明未执行实际连接。它也可能是documentation (under "additional where clauses")的不足之处,因为这并没有提到使用QueryBuilder的限制。
最快的解决方案是动态扩展Validator,如下所示:
public function rules()
{
Validator::extend('custom_rule', function ($attribute, $value) {
// The user that's being edited, if any.
$currentUser = $this->route('user');
$query = User::join('addresses', function ($join) {
$join->on('addresses.user_id', 'users.id')
->where('addresses.address_type', 'home');
})->where($attribute, $value)->where('users.id', '!=', $currentUser->id ?? 0);
// True means pass, false means fail validation.
// If count is 0, that means the unique constraint passes.
return !$query->count();
});
return [
'name' => 'required|custom_rule',
];
}