Laravel полиморфные отношения с пользовательским ключом - PullRequest
1 голос
/ 20 мая 2019

В моем проекте я работаю над несколькими базами данных и одной центральной.Я использую пакет журнала активности spatie для регистрации действий, выполненных из панели управления для всех этих баз данных.

У меня есть таблица Items в каждой из баз данных (кроме центральной) с автоинкрементным первичным ключом и другим индексом, называемым hash, который является своего рода uuid.Хэш всегда уникален.

Теперь, когда я хочу регистрировать действия, я могу столкнуться с проблемой, так как при этом будет сохранен идентификатор элемента, поэтому ... в моих таблицах действий я получу две записи для subject_id = 1, в то время как одно действие произойдет сПункт на одной БД и другой на другой, и так далее.

Как изменить морфинг набора для использования моего столбца uuid вместо идентификатора без изменения значения $ 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;
}

1 Ответ

0 голосов
/ 20 мая 2019

Я закончил с временным взломом.

Прежде всего, я добавил публичный метод в мою модель:

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

Я знаю, что это не лучшее решение, но пока работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...