Проверка Laravel вызывает исключение запроса в моделях сохранения

В моем приложении есть два подключения к базе данных:

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'
];

person Alexandre Thebaldi    schedule 19.08.2015    source источник
comment
Покажите, пожалуйста, config. Сначала проверьте, правильно ли вы указали настраиваемое соединение в config. Попробуйте $ aluno = new Aluno; $ aluno- ›setConnection ('custom'); $ aluno- ›find (1);   -  person Eimantas Gabrielius    schedule 19.08.2015
comment
@EimantasGabrielius, но мое соединение уже настроено на атрибут модели $ connection и работает нормально, проблема в том, что я использую уникальное правило   -  person Alexandre Thebaldi    schedule 19.08.2015
comment
Пожалуйста, покажите, как вы проводите проверку. Модель кормушки или запросы?   -  person Eimantas Gabrielius    schedule 19.08.2015
comment
Модель @EimantasGabrielius   -  person Alexandre Thebaldi    schedule 19.08.2015
comment
я отправил ответ   -  person Eimantas Gabrielius    schedule 19.08.2015


Ответы (2)


просто удалите default_database из своей проверки, попробуйте это

public $rules = [
    'email' => 'required|email|unique:aluno'
];

или попробуйте это, если вы хотите указать настраиваемое соединение

public $rules = [
    'email' => 'required|email|unique:mysql_custom_connection.aluno'
];
person mdamia    schedule 19.08.2015
comment
В документации Laravel говорится: Как видно выше, установка unique: users в качестве правила проверки будет использовать соединение с базой данных по умолчанию для запроса к базе данных. Чтобы переопределить это, укажите соединение, за которым следует имя таблицы, используя синтаксис с точкой. - person Alexandre Thebaldi; 19.08.2015

Попробуй это

     $rules = [
          'email' => 'unique:mysql_custom_connection.aluno,email'
     ];

Работает, сейчас пробовал. Просто поймите, что aluno - это таблица, вам нужно проверить уникальное поле, а не таблицу.

person Eimantas Gabrielius    schedule 19.08.2015
comment
для меня: Table 'mysql_custom_connection.aluno' doesn't exists. По-видимому, в качестве имени базы данных используется первый аргумент вместо подключения приложения - person Alexandre Thebaldi; 19.08.2015
comment
using: database_name.aluno работает над созданием новых моделей, но при обновлении у меня есть исключение - person Alexandre Thebaldi; 19.08.2015
comment
Я вижу, ты не понимаешь. вы не можете определить имя базы данных. База данных, которую вы вызываете, - это ТАБЛИЦА, а вторые параметры - это поле (вы проверяете уникальное поле, а не базу данных.таблица. Пожалуйста, опубликуйте конфигурацию базы данных (измените учетные данные), модель, в которой вы выполняете проверку, и структуру таблицы, если вы хотите получить некоторую помощь - person Eimantas Gabrielius; 19.08.2015
comment
чувак, я знаю это. но зачем мне устанавливать поле «электронная почта», если имя столбца уже «электронная почта»? не имеет смысла - person Alexandre Thebaldi; 19.08.2015
comment
я решаю эту проблему. я отредактирую свой вопрос с решением, подождите - person Alexandre Thebaldi; 19.08.2015