Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用where和join进行Laravel唯一验证_Php_Laravel_Laravel 5.5_Laravel Validation - Fatal编程技术网

Php 使用where和join进行Laravel唯一验证

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

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

我有两张桌子:

团队 带有id和名称字段

角色\用户\团队 角色id、用户id和团队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);
          });
我知道问题在于连接,但我不知道如何解决它。 谢谢大家!

在高级连接子句中

$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
。Object
Auth::user()
不能存在。我认为where子句中不允许join…因此我需要一个新的验证规则来检查我想要的内容。有什么想法吗?事实上,加入似乎不起作用,尽管这在任何地方都没有记录。闭包获得了一个标准的查询生成器对象,因此您希望连接能够正常工作。但是querybuilder对象似乎在之后被编辑,从而破坏了连接。