Как определить, использует ли модель мягкое удаление в 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...
}
Другие вопросы по тегам