Laravel验证唯一/存在与不同的数据库连接

use*_*415 7 laravel laravel-validation laravel-5.1

在文档中,我看到你可以为唯一的规则设置一个很好的连接.但是,存在似乎没有遵循相同的逻辑.以此为例:

$rules = [
    'username'         => 'required|max:40|unique:user',
    'name'             => 'sometimes|required',
    'email'            => 'required|email|max:255|unique:int.user',
    'password'         => 'sometimes|required|confirmed|min:6',
    'password_current' => 'sometimes|required'
];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,唯一规则适用于GREAT.它使用名为'int'的数据库连接并调用用户表.然而,当规则被颠倒时,如下:

$rules['email'] = 'required|email|max:255|exists:int.user';
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

SQLSTATE [42S02]:未找到基表或视图:1146表'int.user'不存在(SQL:从int.user中选择count(*)作为聚合,其中email = haleybuggs6@gmail.com)

它试图调用int.user表而不是使用int数据库连接.

是否有存在的理由与独特的行为不同?谢谢.

小智 13

您可以尝试使用"int"连接中定义的直接数据库名称,而不是使用连接名称.遇到类似的问题,这些方式对我有用.喜欢

$rules['email'] = 'required|email|max:255|exists:DB_Name.user';
Run Code Online (Sandbox Code Playgroud)

  • 这有效.所有者需要将其标记为已接受的答案. (2认同)
  • **重要提示**:这在Laravel 5.1.46中*不起作用。沿线的某个地方更改了验证代码,以将“存在”表达式解析为“ connection.table”,从而中断了数据库名称的使用。一种可行的解决方案是在`config / database.php`中定义多个数据库连接,对于在“存在”规则中使用的每个数据库,一个数据库连接。 (2认同)

Dau*_*han 8

您可以使用

'email'           => 'exists:mysql2.users|required'
Run Code Online (Sandbox Code Playgroud)

其中 mysql2 是 database.php 文件中的第二个数据库设置数组


小智 6

尝试一下。

$rules = [
     'username'         => 'required|max:40|unique:connection_name.user',
     'name'             => 'sometimes|required',
     'email'            => 'required|email|max:255|unique:connection_name.user',
     'password'         => 'sometimes|required|confirmed|min:6',
     'password_current' => 'sometimes|required'
];
Run Code Online (Sandbox Code Playgroud)


Art*_*tan 5

最终,对于 Laravel 5.6.*,您需要查看您尝试验证的模型的现有实例,或指定...

{db_connection_name}.{schema_name}.{table_name}

...以确保您正在查看正确的表格。

验证示例

验证它...

<?php

// for instance... 
//   maybe auth user is in a different db
//   = so you cannot validate with your default db connection
$default_user = Auth::user();

// pass the instance in order to allow Validator to qualify the proper connection/name
\App\Validation\User::validate($_POST, $default_user);

Run Code Online (Sandbox Code Playgroud)

用户验证类

<?php
namespace App\Validation;

class User extends Validator
{
    /**
     * @param \Illuminate\Database\Eloquent\Model|string $mixed
     * @param string $default
     * @return string
     */
    public static function table($mixed,$default='default_connection.app_schema.users_table')
    {
        if($mixed instanceof \Illuminate\Database\Eloquent\Model){
            $table = $mixed->getConnectionName().'.'.$mixed->getTable();
        } else {
            if (! empty($mixed)) {
                $table = $mixed;
            } else {
                $table = $default;
            }
        }
        return $table;
    } 

    /**
     * validation to create a new user
     *
     * @param array $data
     * @param \App\User|string $mixed
     * @return array
     * @throws \Illuminate\Validation\ValidationException
     */
    public static function validate(array $data, $mixed='default_connection.app_schema.users_table'){
        return Validator::validate($data,[
            'username'         => 'required|max:40|unique:'.self::table($mixed),
            'name'             => 'sometimes|required',
            'email'            => 'required|email|max:255|unique:'.self::table($mixed),
            'password'         => 'sometimes|required|confirmed|min:6',
            'password_current' => 'sometimes|required'
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)