#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. потенциально вы могли бы использовать пользовательскую модель для сводной точки, но для этой сущности будет сохранена история, а не модели с обеих сторон