[РЕДАКТИРОВАТЬ] После прочтения вашего вопроса, похоже, я неправильно понял некоторые части.Если, сказав
, мне нужно, чтобы часть результата (запрос A) была сохранена в базе данных без транзакции
Вы имеете в виду «использовать значения, вставленные в транзакцию доконец транзакции ", я думаю, это невозможно.Вы все еще можете использовать мой ответ для мгновенного добавления или обновления данных, но вы не сможете прочитать что-то, что вы вставили в транзакцию до ее завершения.
Вы можетепродублируйте соединение, которое вы используете для транзакции в database.php
.Для этого примера предположим, что вы называете это 'mysql_outside_transaction'
.После подключения по умолчанию у вас должно быть что-то подобное в файле database.php
:
'mysql_outside_transaction' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
Оттуда, поскольку у вас есть второе доступное подключение к той же базе данных, вы можете использовать его для сохранения данныхвам нужно напрямую внутри транзакции.
Опять же, для примера, если у вас есть экземпляр $modelA
, вы можете сказать ему использовать ваше второе соединение: $modelA->setConnection('mysql_outside_transaction');
.После этого каждая операция базы данных, исходящая из этого экземпляра, будет выполняться вне вашей транзакции (поскольку она будет использовать второе настроенное вами соединение, а не то, которое использовалось для транзакции).
Не забудьте, что вы можете установитьсоединение использовать во многих отношениях.Это может быть непосредственно в атрибутах класса модели (protected $connection = 'your_connection';
), с фасадом DB
(DB::connection('your_connection');
) и, возможно, другими способами, о которых я сейчас не думаю:)