应用程序有两个数据库连接:
mysql_default_connection => default_database
mysql_custom_connection => custom_database
我有一些问题与Laravel unique
验证。
protected $connection = 'mysql_custom_connection';
protected $table = 'aluno';
public $rules = [
'email' => 'required|email|unique:custom_database.aluno'
];
当我尝试保存一个新模型时,唯一的规则工作,但是当从aluno
检索一些模型并尝试将其保存为:
$aluno = Aluno::find(1);
$aluno->attribute = 'new value';
$aluno->save();
这日志:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'default_database.aluno' doesn't exist (SQL: select count(*) as aggregate from `aluno` where `email` = aluno3@email.com and `id` <> 50)
如果我从验证中删除unique
规则,工作正常。
特别是,我不明白为什么要在Table 'default_database.aluno'
中查询,因为这个数据库不是上面的模型连接。
我的连接配置
'connections' => [
'mysql_default_connection' => [
'driver' => 'mysql',
'host' => 'localhost',
'port' => 3306,
'database' => 'default_database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
'mysql_custom_connection' => [
'driver' => 'mysql',
'host' => 'localhost',
'port' => 3306,
'database' => 'custom_database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
];
'default' => 'mysql_default_connection',
aluno模型相关部分
protected $connection = 'mysql_custom_connection';
protected $table = 'aluno';
public $rules = [
'nome' => 'required|between:5, 45',
'email' => 'required|email|unique:custom_database.aluno|max:64'
];
此规则适用于创建新模型
<<p> 解决方案/strong>我使用的是实现Laravel的十月cms,这个问题是十月cms的麻烦,而不是Laravel,对不起。为了对模型进行验证,我们需要使用October Validation trait,它让$rules, $attributeNames and $customMessages
数组调用Validator::make()...
。
在这个trait中,October只是忽略了验证时的模型连接
/**
* Instantiates the validator used by the validation process, depending if the class is being used inside or
* outside of Laravel.
* @return 'Illuminate'Validation'Validator
*/
protected static function makeValidator($data, $rules, $customMessages, $attributeNames)
{
return Validator::make($data, $rules, $customMessages, $attributeNames);
}
和
/*
* Hand over to the validator
*/
$validator = self::makeValidator($data, $rules, $customMessages, $attributeNames);
所以,我确实需要改变
protected static function makeValidator($data, $rules, $customMessages, $attributeNames,$connection = null)
{
$validator = Validator::make($data, $rules, $customMessages, $attributeNames);
if($connection !== null) {
$validator->getPresenceVerifier()->setConnection($connection);
}
return $validator;
}
和
$validator = self::makeValidator($data, $rules, $customMessages, $attributeNames,$this->connection);
现在像一个魅力
$rules = [
'email' => 'required|unique:aluno'
];
从验证中删除default_database,试试这个
public $rules = [
'email' => 'required|email|unique:aluno'
];
或者如果您想要指定自定义连接
,请尝试此操作。public $rules = [
'email' => 'required|email|unique:mysql_custom_connection.aluno'
];
试试这个
$rules = [
'email' => 'unique:mysql_custom_connection.aluno,email'
];
它工作,我已经试过了。只要理解aluno是表,您需要检查唯一字段而不是表。