如何在跨数据库设置中对序列化模型使用 laravel 通知?
How to use laravel notifications for serialized models in a cross database setup?
我当前的设置是 User
和 Notification
保存到我的主数据库,Post
保存到另一个数据库。
User
和 Notification
数据库连接是:
protected $connection = "main";
和 Post
数据库连接是:
protected $connection = "second";
我的通知table 已保存到主数据库。我有一个名为 "PostReplied" 的通知 class,它采用 $post
作为参数。所以它在排队时被序列化。当它开始处理这个作业时,它试图从 "main" 数据库而不是 Post
的连接 "second" 数据库中获取 post。
关于如何使通知与跨数据库模型一起工作有什么建议吗?
解决方案 1
根据您使用的多租户设置,它可能依赖于在模型上设置连接名称。例如,您可以像这样为 Post 模型设置连接:
Models/Post.php
/**
* Get the current connection name for the model.
*
* @return string|null
*/
public function getConnectionName()
{
return 'tenant_connection';
}
然后你需要在database.connections
配置中定义一个tenant_connection
键(config/database.php
)。我知道 hyn/multitenant
是这样做的 (https://packagist.org/packages/hyn/multi-tenant)。
解决方案 2
另一种较小的方法是在创建查询时随时切换连接,如下所示:
DB::setDefaultConnection('custom_connection');
Post::query()->where('status', 1)->get();
// Revert to default connection, assuming `mysql` here.
DB::setDefaultConnection('mysql');
这给了你更多的自由,但你的代码会变得更混乱,我不推荐它。
解决方案 3
这个也会让你的代码更难理解。您可以在查询中包含数据库名称,如下所示:
DB::table('database1.posts as d1p')
->leftjoin('database2.users as d2u', 'd1p.user_id', '=', 'd2u.id');
您可以使用 Eloquent 构建器函数混合搭配。
我当前的设置是 User
和 Notification
保存到我的主数据库,Post
保存到另一个数据库。
User
和 Notification
数据库连接是:
protected $connection = "main";
和 Post
数据库连接是:
protected $connection = "second";
我的通知table 已保存到主数据库。我有一个名为 "PostReplied" 的通知 class,它采用 $post
作为参数。所以它在排队时被序列化。当它开始处理这个作业时,它试图从 "main" 数据库而不是 Post
的连接 "second" 数据库中获取 post。
关于如何使通知与跨数据库模型一起工作有什么建议吗?
解决方案 1
根据您使用的多租户设置,它可能依赖于在模型上设置连接名称。例如,您可以像这样为 Post 模型设置连接:
Models/Post.php
/**
* Get the current connection name for the model.
*
* @return string|null
*/
public function getConnectionName()
{
return 'tenant_connection';
}
然后你需要在database.connections
配置中定义一个tenant_connection
键(config/database.php
)。我知道 hyn/multitenant
是这样做的 (https://packagist.org/packages/hyn/multi-tenant)。
解决方案 2
另一种较小的方法是在创建查询时随时切换连接,如下所示:
DB::setDefaultConnection('custom_connection');
Post::query()->where('status', 1)->get();
// Revert to default connection, assuming `mysql` here.
DB::setDefaultConnection('mysql');
这给了你更多的自由,但你的代码会变得更混乱,我不推荐它。
解决方案 3
这个也会让你的代码更难理解。您可以在查询中包含数据库名称,如下所示:
DB::table('database1.posts as d1p')
->leftjoin('database2.users as d2u', 'd1p.user_id', '=', 'd2u.id');
您可以使用 Eloquent 构建器函数混合搭配。