具有自定义密钥的Laravel多态关系

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (48)

在我的项目中,我正在研究多个数据库和一个中心数据库。我正在使用spatie的活动日志包将控制面板完成的操作记录到所有数据库。

我在每个数据库(中央除外)中有自动递增主键的表项,还有另一个名为hash的索引,这是一种uuid。哈希总是独一无二的。

现在,当我想记录操作时,我会遇到问题,因为它会保存Item的ID,所以...在我的活动表中,我将获得subject_id = 1的两条记录,而一个活动发生在一个数据库上的Item和另一个在另一个,等等。

如何更改设置变形以使用我的uuid列而不是id而不更改相关模型上的$ primaryKey?

项目模型关系:

public function activities(): MorphMany
{
    $this->morphMany(Activity::class, 'subject', 'subject_id', 'hash');
}

活动模型关系:

public function subject(): MorphTo
{
    if (config('activitylog.subject_returns_soft_deleted_models')) {
        return $this->morphTo()->withTrashed();
    }
    return $this->morphTo('activity_log', 'subject_type', 'subject_id', 'hash');
}

另外,我在ActivityLogger中找到了:

public function performedOn(Model $model)
{
    $this->getActivity()->subject()->associate($model);

    return $this;
}
提问于
用户回答回答于

我结束了临时黑客攻击。

首先,我在我的模型中添加了一个公共方法:

public function setPrimaryKey(string $columnName)
{
    $this->primaryKey = $columnName;
    $this->keyType = 'string';
}

后来我扩展了ActivityLogger类并实现了我自己的perfomedOn()方法。

public function performedOn(Model $model)
{
    if($model instanceof Item::class) {
        $model->setPrimaryKey('hash');
    }

    return parent::performedOn($model);
}

我知道它不是最好的解决方案,但现在有点工作。

扫码关注云+社区

领取腾讯云代金券