具有自定义键的Laravel多态关系

时间:2019-05-20 08:05:07

标签: php laravel eloquent

在我的项目中,我正在处理多个数据库和一个中央数据库。 我正在使用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;
}

1 个答案:

答案 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);
}

我知道这不是最好的解决方案,但目前可以解决。