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 и таблица существует.

Спасибо

Другие вопросы по тегам