Laravel Model override имеет другое поведение - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь переопределить подключение базы данных по умолчанию, используемое моделью, к другому, которое я определил в config/database.php.

Однако при массовой вставке данных две указанные ниже вставки работают по-разному:

$model= new SomeModel();
$model->setConnection('another_connection');

// Throws exception due to invalid data which needs casted, 
// done via setSomeFieldAttribute() methods defined in SomeModel()
$model->insert($data);

// Works, performs setSomeFieldAttribute() methods 
// but inserts data on default connection
$model::insert($data);

Как выполнить массовую вставку с помощью методов setAttribute() для установленного соединения?

Ответы [ 3 ]

0 голосов
/ 02 октября 2019

Проблема с тем, что вы делаете, заключается в том, что всякий раз, когда вы запускаете метод в Eloquent Model, он запускает запрос к объекту Illuminate\Query\Builder после прохождения через функцию-оболочку Illuminate\Query\Builder. Объект Query Builder хранит кэш / ссылку на объект соединения, используемый для запроса. Поскольку ваша Модель создается в первую очередь до изменения соединения, объект Query Builder будет использовать старое соединение.

Существует несколько способов решения проблемы, с которой вы столкнулись:

1. Вы можете использовать статическую функцию on:

Model::on('new_connection')->insert($data);

2. Использовать метод fresh в вашем случае :

$model = SomeModel();

$model->setConnection('new_connection')->fresh()->insert($data);

Просто обратите внимание, что метод fresh запускает новый запрос по сравнению с другим параметром, который устанавливает соединение без запуска нового запроса.

0 голосов
/ 02 октября 2019

ОК. Я обнаружил проблему.

При настройке нового подключения к базе данных в config/database.php я установил strict в true. Для всех моих соединений установлено значение false:

'another_connection' => [
    'strict' => true,
    'driver' => 'mysql',
    '...'=> ...
]

Ответ найден здесь: https://stackoverflow.com/a/52685074/3554278

В MySQL 5.7 введен строгий режим, если кто-то хочет больше читать:https://mattstauffer.com/blog/strict-mode-and-other-mysql-customizations-in-laravel-5-2/

0 голосов
/ 02 октября 2019

Когда вы делаете $model->setConnection(...), вы устанавливаете его только для этого объекта. Поэтому, когда вы называете это статически, он не будет учитывать информацию

Если вы хотите изменить ее на уровне модели, добавьте свойство protected $connection = 'another_connection'; в вашу модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...