在 Laravel 通知中获得通知并实现自定义变形关系
getting notifiable and implementing custom morph relation in Laravel notification
我想在获取特定用户的通知时获取 notifiable model
关系。另外,我想在通知 table(就像 notifiable
)中保存并获取自定义变形关系(即 causer
(causer_id
和 causer_type
))。我能够创建变形关系并将其保存到 table 记录中,但是我在获取关系模型时遇到了问题,它在两个关系中都是 returns null
。分享代码。
- 自定义
DatabaseChannel
-- 修改后的 buildPayload 方法。
protected function buildPayload($notifiable, Notification $notification)
{
$data = $this->getData($notifiable, $notification);
$causer = $data['causer'];
unset($data['causer']);
return [
// README: removed uuid from here
'type' => method_exists($notification, 'databaseType')
? $notification->databaseType($notifiable)
: get_class($notification),
'data' => $data,
'read_at' => null,
'causer_type' => get_class($causer),
'causer_id' => $causer->id,
];
}
- 自定义
notifiable
特征
use Illuminate\Notifications\Notifiable as BaseNotifiable;
trait Notifiable
{
use BaseNotifiable;
/**
* Get the entity's notifications.
*/
public function notifications(): MorphMany
{
return $this->morphMany(Notification::class, 'notifiable')
->orderBy('created_at', 'desc');
}
}
我还想问一件事,如何将两个变体关系引用到单个 table,就像我想添加 notifications
方法和 causer
以及 notifiable
.
- 定制
Notifications
型号
class Notification extends DatabaseNotification
{
public function causer()
{
return $this->morphTo();
}
}
我遗漏了什么或做错了什么?我想做的事情有可能吗?
为了获得变形关系(一个或两个),您需要 select 列 {morph}_id
和 {morph}_type
,以防万一您使用 ->select()
在获取记录时,如果您不使用 select
,那不会有任何问题。
编辑
以下是将自定义列添加到 notifications
table
的方法
public function up()
{
Schema::table('notifications', function (Blueprint $table) {
$table->string("causer_type")->after('notifiable_id');
$table->unsignedInteger("causer_id")->after('causer_type');
$table->index(["causer_type", "causer_id"]);
});
}
public function down()
{
Schema::table('notifications', function (Blueprint $table) {
$table->dropMorphs('causer');
});
}
我想在获取特定用户的通知时获取 notifiable model
关系。另外,我想在通知 table(就像 notifiable
)中保存并获取自定义变形关系(即 causer
(causer_id
和 causer_type
))。我能够创建变形关系并将其保存到 table 记录中,但是我在获取关系模型时遇到了问题,它在两个关系中都是 returns null
。分享代码。
- 自定义
DatabaseChannel
-- 修改后的 buildPayload 方法。
protected function buildPayload($notifiable, Notification $notification)
{
$data = $this->getData($notifiable, $notification);
$causer = $data['causer'];
unset($data['causer']);
return [
// README: removed uuid from here
'type' => method_exists($notification, 'databaseType')
? $notification->databaseType($notifiable)
: get_class($notification),
'data' => $data,
'read_at' => null,
'causer_type' => get_class($causer),
'causer_id' => $causer->id,
];
}
- 自定义
notifiable
特征
use Illuminate\Notifications\Notifiable as BaseNotifiable;
trait Notifiable
{
use BaseNotifiable;
/**
* Get the entity's notifications.
*/
public function notifications(): MorphMany
{
return $this->morphMany(Notification::class, 'notifiable')
->orderBy('created_at', 'desc');
}
}
我还想问一件事,如何将两个变体关系引用到单个 table,就像我想添加 notifications
方法和 causer
以及 notifiable
.
- 定制
Notifications
型号
class Notification extends DatabaseNotification
{
public function causer()
{
return $this->morphTo();
}
}
我遗漏了什么或做错了什么?我想做的事情有可能吗?
为了获得变形关系(一个或两个),您需要 select 列 {morph}_id
和 {morph}_type
,以防万一您使用 ->select()
在获取记录时,如果您不使用 select
,那不会有任何问题。
编辑
以下是将自定义列添加到 notifications
table
public function up()
{
Schema::table('notifications', function (Blueprint $table) {
$table->string("causer_type")->after('notifiable_id');
$table->unsignedInteger("causer_id")->after('causer_type');
$table->index(["causer_type", "causer_id"]);
});
}
public function down()
{
Schema::table('notifications', function (Blueprint $table) {
$table->dropMorphs('causer');
});
}