SoftDeletes не фильтруют при использовании метода загрузки в модели

у меня есть 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 решает проблему.

Почему это происходит, и как я могу это исправить?

1

Решение

Во-первых, я собираюсь предположить, что вы не звоните parent::boot(); в твоих чертах boot метод, поэтому вы получаете эту проблему. Вы переопределяете метод загрузки родителя. Тем не менее, я бы не рекомендовал этот подход по нескольким причинам, и Laravel фактически рекомендует стандартное соглашение об именах, когда речь идет о добавлении метода загрузки к вашей характеристике.

Если ваша черта имеет boot метод, он переопределит родительскую модель boot метод. Вы можете добавить parent::boot(); метод к чертам boot метод, чтобы исправить это так, чтобы он вызвал родительский boot метод также. Однако, если ваша модель имеет boot метод, он в основном удалит метод загрузки черты. Добавление метода загрузки к вашей черте создает потенциальные конфликты, будь то сейчас, позже или если кто-то еще попытается использовать вашу черту.

Чтобы противостоять этой проблеме, Laravel рекомендует назвать метод загрузки черты в следующем формате: boot{TraitName},

Другими словами, ваша Черта называется Versionable поэтому ваш код будет работать, если вы переименуете метод загрузки в этот:

public static function bootVersionable(){
// ...
}

Редактировать: Источник

Если в модели Eloquent используется черта, у которой есть метод, соответствующий соглашению об именах bootNameOfTrait, то этот метод черты будет вызываться при загрузке модели Eloquent, давая вам возможность зарегистрировать глобальную область или сделать что-либо еще, что вы захотите.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]