В моем приложении есть два подключения к базе данных:
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` = [email protected] 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'
];
Эти правила работают при создании новых моделей
РЕШЕНИЕ
Я использую OctoberCMS, реализующий Laravel, и эта проблема связана с OctoberCMS, а не с Laravel, извините. Чтобы выполнить валидацию модели, нам нужно использовать трейт October Validation, который заставляет массивы $rules, $attributeNames and $customMessages
вызывать Validator::make()...
.
В этом свойстве 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'
];