Как определить, использует ли модель мягкое удаление в Laravel 4.2
Как определить, использует ли модель мягкое удаление в Laravel 4.2?
В API Laravel я обнаружил функцию isoftDeleting(), но, видимо, она была удалена из Laravel 4.2 теперь, когда она использует SoftDeletingTrait.
Как мне определить, использует ли модель мягкое удаление сейчас?
6 ответов
Если вы хотите программно проверить, использует ли Модель мягкое удаление, вы можете использовать функцию PHP class_uses
чтобы определить, использует ли ваша модель SoftDeletingTrait
// You can use a string of the class name
$traits = class_uses('Model');
// Or you can pass an instance
$traits = class_uses($instanceOfModel);
if (in_array('SoftDeletingTrait', $traits))
{
// Model uses soft deletes
}
// You could inline this a bit
if (in_array('SoftDeletingTrait', class_uses('Model')))
{
// Model uses soft deletes
}
Мне нужно было обнаружить мягкое удаление в модели, где черта была включена в родительский класс, поэтому class_uses()
не работал для меня. Вместо этого я проверил на bootSoftDeletingTrait()
метод. Что-то вроде:
// Class Name
$usesSoftDeletes = method_exists('User', 'bootSoftDeletingTrait');
или же
// Model Instance
$usesSoftDeletes = method_exists($model, 'bootSoftDeletingTrait');
должно сработать.
Только для Laravel 5.x
При проверке основной модели:
//class_uses retrieves a list of traits from the object passed into an array
//Hence in_array check for name of trait (in string format)
//@param bool $usesSoftDeletes
$usesSoftDeletes = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($model));
Если вы проверяете отношения основной модели, используйте следующее:
//Replace `myRelationshipName` by the name of the relationship you are checking on.
//getRelated() function fetches the class of the relationship.
//@param bool $relatedUsesSoftDeletes
$relatedModel = $model->myRelationshipName()->getRelated();
$relatedUsesSoftDeletes = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($relatedModel));
Ну, я нашел достаточно хорошее решение для своих нужд.
Сначала я сделаю этот звонок:
$traits = class_uses($model);
Затем я проверяю на softdeletingtrait
$usesSoftDeletes = in_array('Illuminate\Database\Eloquent\SoftDeletingTrait', $traits);
По крайней мере, так я избегаю вызова базы данных для каждой модели, которую я тестирую. Хотя это сломается, если они изменят имя или местоположение SoftDeletingTrait позже...
В принципе нет прямого подхода к определению, удаляет ли софт модели путем вызова функции, так как метод isSoftDeleting()
был удален из 4.2. Вы знаете, если модель использует мягкое удаление, если use SoftDeletingTrait;
присутствует в классе вашей модели и когда deleted_at
столбец существует в вашей таблице базы данных.
Вы можете в основном доверять Laravel при удалении записи из вашей базы данных, используя мягкое удаление, когда вы определили use SoftDeletingTrait
в классе вашей модели, и есть deleted_at
(является TIMESTAMP) в таблице базы данных вашей модели.
Это лучший способ
$model = 'App\\Models\\ModelName';
$uses_soft_delete = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($model));
if($usesSoftDeletes) {
// write code...
}