Запуск модели признаков при обновлении связи с синхронизацией

#laravel #eloquent

Вопрос:

Я использую функцию «история» в своем приложении Laravel для хранения изменений в отредактированных строках. Но у меня проблема в том, что мои отношения по модели не запускают эту Historyable черту. Я попытался добавить эту черту в модели отношений, но, тем не менее, никаких зарегистрированных изменений в этих связанных моделях не было.

Например, в моей AppGame модели у меня есть такое отношение к жанру:

 public function genres(){
    return $this->belongsToMany(Genre::class);
}
 

И по-моему GameController , для обновления жанрового отношения я делаю это:

 public function update(Request $request, Game $game)
{
    $game->genres()->sync($request->get('genre'));
}
 

Черта на AppGame называется Historyable и выглядит так:

 trait Historyable {

    /**
     * [bootHistoryable description]
     * @return [type] [description]
     */
    public static function bootHistoryable(){
         static::updated(function(Model $model){
            collect($model->getWantedChangedColums($model))->each(function ($change) use ($model) {
                $model->saveChange($change);
            });
        });
    }

    /**
     * [save description]
     * @return [type] [description]
     */
    protected function saveChange(ColumnChange $change){
        $this->history()->create([
            'changed_column' => $change->column,
            'changed_value_from' => $change->from,
            'changed_value_to' => $change->to,
            'user_id' => Auth::user()->id
        ]);
    }

    /**
     * [getWantedChangedColums description]
     * @param  Model  $model [description]
     * @return [type]        [description]
     */
     protected function getWantedChangedColums(Model $model){
        return collect(
            array_diff(
                Arr::except($model->getChanges(), $this->ignoreHistoryColumns()),
                $original = $model->getOriginal()
            )
        )->map(function($change, $column) use ($original){
            return new ColumnChange($column, Arr::get($original, $column), $change);
        });
    }

    /**
     * [history description]
     * @return [type] [description]
     */
    public function history(){
        return $this->morphMany(History::class, 'historyable')->latest();
    }

    /**
     * [ignoreHistoryColumns description]
     * @return [type] [description]
     */
    public function ignoreHistoryColumns() {
        return [
            'updated_at',
            'password'
        ];
    }
    
}
 

Как я могу уволить эту Historyable черту?

Комментарии:

1. здесь не задействована модель … sync обновляет сводную таблицу с помощью взаимосвязи, а не моделей на обоих концах

2. Ага, хорошо. спасибо @lagbox, это дало мне еще некоторое представление

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