Php 使用where和join进行Laravel唯一验证
我正在尝试在唯一验证规则中添加传统where子句。但在此之前,我需要一个与其他表的联接。但我没有成功 我有两张桌子: 团队 带有id和名称字段 角色\用户\团队 角色id、用户id和团队id是这三个关键 因此,我需要检查teams.name字段对于一个特定用户是否是唯一的。 我确实试过:Php 使用where和join进行Laravel唯一验证,php,laravel,laravel-5.5,laravel-validation,Php,Laravel,Laravel 5.5,Laravel Validation,我正在尝试在唯一验证规则中添加传统where子句。但在此之前,我需要一个与其他表的联接。但我没有成功 我有两张桌子: 团队 带有id和名称字段 角色\用户\团队 角色id、用户id和团队id是这三个关键 因此,我需要检查teams.name字段对于一个特定用户是否是唯一的。 我确实试过: 'name' => Rule::unique('teams')->where(function ($query){ //return $query->where('account_id
'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);
});
我知道问题在于连接,但我不知道如何解决它。
谢谢大家! 在高级连接子句中
$query->join('role_user', function ($join) {
return $join->on('role_user.team_id', '=', 'teams.id')->on('role_user', '=', Auth::id());
});
这似乎是Laravel在实际查询DB之前处理QueryBuilder对象的一个错误。打印查询日志显示,未执行任何实际连接。这也可能是中的不足之处,因为这没有提到对使用QueryBuilder的限制 最快的解决方案是动态扩展验证程序,如下所示:
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',
];
}
Laravel 5.8-问题仍然存在 请参阅\illumb\Validation\DatabasePresenceVerifier类,方法addConditions() 可以清楚地看到,如果验证规则条件是闭包,那么它将在嵌套的where部分内执行,这排除了使用联接的可能性:
/**
* Add the given conditions to the query.
*
* @param \Illuminate\Database\Query\Builder $query
* @param array $conditions
* @return \Illuminate\Database\Query\Builder
*/
protected function addConditions($query, $conditions)
{
foreach ($conditions as $key => $value) {
if ($value instanceof Closure) {
$query->where(function ($query) use ($value) {
$value($query);
});
} else {
$this->addWhere($query, $key, $value);
}
}
return $query;
}
是的,使用加入验证规则的唯一方法是创建自己的规则,如aross sayd。使用
Auth::id()
而不是Auth::user()->id
。ObjectAuth::user()
不能存在。我认为where子句中不允许join…因此我需要一个新的验证规则来检查我想要的内容。有什么想法吗?事实上,加入似乎不起作用,尽管这在任何地方都没有记录。闭包获得了一个标准的查询生成器对象,因此您希望连接能够正常工作。但是querybuilder对象似乎在之后被编辑,从而破坏了连接。