在 Laravel 通知中获得通知并实现自定义变形关系

getting notifiable and implementing custom morph relation in Laravel notification

我想在获取特定用户的通知时获取 notifiable model 关系。另外,我想在通知 table(就像 notifiable)中保存并获取自定义变形关系(即 causercauser_idcauser_type))。我能够创建变形关系并将其保存到 table 记录中,但是我在获取关系模型时遇到了问题,它在两个关系中都是 returns null。分享代码。

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,
        ];
    }
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.

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');
        });
    }