我正在使用Laravel v5.7开发一个多租户,并且我成功发送了队列电子邮件,因为我的模型已经定义了属性“连接”。
但是,当尝试使用Jobs类发送电子邮件时,同样失败并通知模型表不存在。
根据表'failed_jobs'中记录的错误,即使定义了属性'connection',作业仍然会尝试连接到主数据库而不是属性的指定数据库。
有没有办法在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
我想您正在尝试访问模板模型中的第二个连接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中正确定义所有内容并且表存在。
谢谢