Существует маленькая хитрость, с помощью мягкого удаления таблиц и запросов в Laravel:
Когда мы создаем что-то вроде
$objCars = Car::where("color","blue");
Система выполняет что-то вроде этого:
SELECT
*
FROM
cars
WHERE
deleted_at IS NULL
AND
"color" = 'blue'
Пока что так хорошо.Но, когда мы применяем метод «orWhere», что-то смешное происходит
$objCars = Car::where("color","blue")->orWhere("color","red");
Система будет выполнять что-то вроде этого:
SELECT
*
FROM
cars
WHERE
deleted_at IS NULL
AND
"color" = 'blue'
OR
"color" = 'red'
Этот новый запрос будет возвращать все машины, где deleted_at равно нулю и цвет синий или если цвет красный, даже если значение deleted_at не равно нулю. Это одно и то же поведение этого другого запроса, то, что показать проблему более явно:
SELECT
*
FROM
cars
WHERE
(
deleted_at IS NULL
AND
"color" = 'blue'
)
OR
"color" = 'red'
Чтобы уйти от этой проблемы, вы должны изменить «где» метод проходящего замыкание. Как что:
$objCars = Car::where(
function ($query) {
$query->where("color","blue");
$query->orWhere("color","red");
}
);
Затем система будет выполнять что-то вроде этого:
SELECT
*
FROM
cars
WHERE
deleted_at IS NULL
AND
(
"color" = 'blue'
OR
"color" = 'red'
)
Этот последний запрос, поиск всех автомобилей, где deleted_at является нулевым, и где цвет может быть или красным или синим, как мы этого хотели.
Вы можете разместить код, в котором вы удаляете объекты, а также, где вы запрашиваете их для отображения на странице? – msturdy
спасибо, я уже решил проблему ... Я использовал Fluent-запросы вместо Eloquent, это и стало причиной этого поведения –
Для будущих посетителей: [прочитайте это, если вы используете 4.2] (https://laracasts.com/ Форум /? p = 1766-laravel-4-2-soft-deletes-issue/0) – zehelvion