在我的项目中,我正在处理多个数据库和一个中央数据库。 我正在使用spatie的活动日志包将通过控制面板完成的操作记录到所有这些数据库中。
我在每个数据库(中央数据库除外)中都有表项,这些表项具有自动递增的主键,以及另一个称为哈希的索引,这是一种uuid。哈希始终是唯一的。
现在,当我要记录操作时,我会遇到问题,因为它将保存Item的ID,所以...在我的活动表中,我将获得两条subject_id = 1的记录,而一项活动发生在Item上db和另一个在另一个上,依此类推。
如何在不更改相关模型的$ primaryKey的情况下更改集合变形以使用我的uuid列而不是id?
项目模型关系:
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;
}
答案 0 :(得分:0)
我最终遭到了临时黑客入侵。
首先,我在模型中添加了一个公共方法:
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);
}
我知道这不是最好的解决方案,但目前可以解决。