Laravel: задания не выполнены - SQLSTATE[42S02]: базовая таблица или представление не найдены
Я разрабатываю Multi Tenant с Laravel v5.7 и успешно отправляю электронные письма в очереди, поскольку в моих моделях определено свойство 'connection'.
Но при попытке отправить, например, электронное письмо с использованием класса Jobs, произойдет сбой, который сообщит, что таблица модели не существует.
Исходя из того, какая ошибка записана в таблице failed_jobs, даже с определенным свойством connection, получается, что Job, тем не менее, пытается соединиться с основной базой данных, а не с указанной базой данных свойства.
Есть ли способ указать в Job, какую базу данных использовать, так как это указано в модели?
database.php
'connections' => [
'others' => ['...']
'TENANT001' => [
'driver' => 'mysql',
'database' => env('TENANT001_DATABASE', ''),
'host' => env('TENANT001_HOSTNAME', ''),
'port' => env('DB_PORT', '3306'),
'username' => env('TENANT001_USERNAME', 'forge'),
'password' => env('TENANT001_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
],
Образец модели
class Template extends Model
{
/**
* The database name used by the model.
*
* @var string
*/
protected $connection = 'TENANT001';
}
failed_jobs
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'main_database.templates' doesn't exist in /www/samba/laravel.local/vendor/laravel/framework/src/Illuminate/Database/Connection.php:326
1 ответ
Я полагаю, вы пытаетесь получить доступ ко второму соединению TENANT001 в шаблонной модели.
class Template extends Model
{
/**
* The database name used by the model.
*
* @var string
*/
protected $connection = 'TENANT001';
protected $table='templates';
}
После этого в вашем config/database.php
'connections' => [
'others' => ['...']
'TENANT001' => [
'driver' => 'mysql',
'database' => env('TENANT001_DATABASE', ''),
'host' => env('TENANT001_HOSTNAME', ''),
'port' => env('DB_PORT', '3306'),
'username' => env('TENANT001_USERNAME', 'forge'),
'password' => env('TENANT001_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
Или вы можете использовать соединение в queue.php
'database' => [
'connection' => 'TENANT001'
'driver' => 'mysql',
'table' => 'jobs',
'queue' => 'default',
'expire' => 60,
],
И очистите кеш, как только вы обновите.env файлы.
php artisan config:cache
И проверьте, что вы все правильно определили в.env и таблица существует.
Спасибо