у меня есть Model
который использует мягкое удаление в Laravel, и который также использует черту, которая включает в себя boot
функция:
class Design extends Model {
uses Softdeletes, Versionable;
// ...
}
trait Versionable {
public static function boot(){
// ...
}
}
Сами SoftDeletes все еще работают: столбец delete_at заполняется правильно. Тем не мение, Designs::get()
неправильно фильтрует удаленные модели:
return Designs::get();
[{"id":1,"project_id":1,"name":"","description":null,"created_at":"2015-12-04 21:06:40","updated_at":"2015-12-04 21:06:40","deleted_at":null},
{"id":2,"project_id":1,"name":"A Design","description":"a different description", "created_at":"2015-12-04 21:06:57","updated_at":"2015-12-04 21:07:09","deleted_at":"2015-12-04 21:07:09"}]
Удаление либо Versionable
черта или boot
Метод из Versionable решает проблему.
Почему это происходит, и как я могу это исправить?
Во-первых, я собираюсь предположить, что вы не звоните parent::boot();
в твоих чертах boot
метод, поэтому вы получаете эту проблему. Вы переопределяете метод загрузки родителя. Тем не менее, я бы не рекомендовал этот подход по нескольким причинам, и Laravel фактически рекомендует стандартное соглашение об именах, когда речь идет о добавлении метода загрузки к вашей характеристике.
Если ваша черта имеет boot
метод, он переопределит родительскую модель boot
метод. Вы можете добавить parent::boot();
метод к чертам boot
метод, чтобы исправить это так, чтобы он вызвал родительский boot
метод также. Однако, если ваша модель имеет boot
метод, он в основном удалит метод загрузки черты. Добавление метода загрузки к вашей черте создает потенциальные конфликты, будь то сейчас, позже или если кто-то еще попытается использовать вашу черту.
Чтобы противостоять этой проблеме, Laravel рекомендует назвать метод загрузки черты в следующем формате: boot{TraitName}
,
Другими словами, ваша Черта называется Versionable
поэтому ваш код будет работать, если вы переименуете метод загрузки в этот:
public static function bootVersionable(){
// ...
}
Редактировать: Источник
Если в модели Eloquent используется черта, у которой есть метод, соответствующий соглашению об именах bootNameOfTrait, то этот метод черты будет вызываться при загрузке модели Eloquent, давая вам возможность зарегистрировать глобальную область или сделать что-либо еще, что вы захотите.
Других решений пока нет …