Laravel对where和join的独特验证

问题描述 投票:1回答:2

我正在尝试在唯一验证规则中添加其他where子句。但在此之前,我需要与其他表联系。但我没有成功。

我有2个表:

球队

带有id和name字段

role_user_team

使用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);
          });

我知道问题在于加入,但我不知道如何解决它。谢谢!

php laravel laravel-5.5 laravel-validation
2个回答
0
投票

高级加入条款中的Look at the documentation

$query->join('role_user', function ($join) {
    return $join->on('role_user.team_id', '=', 'teams.id')->on('role_user', '=', Auth::id());
});

0
投票

这似乎是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',
    ];
}
© www.soinside.com 2019 - 2024. All rights reserved.