Почему SoftDelete не будет подделывать удаленную строку?

Может кто-нибудь сказать мне, почему использование метода delete() не удалит выбранную строку в таблице? SoftDelete работает хорошо, но строка, которая была обратимо удалена, все еще существует в таблице. Я ожидаю, что моя строка таблицы будет скрыта или удалена, но это невозможно. Любые советы или помощь будут оценены! :) Я SoftDelete вот такой стол.

Контроллер:

public function hideApprovalsDocument(Request $request, Document $id)
{
    //Getting the request in the View.
    $id = $request->get('softDelete');
    $hide = Document::findOrFail($id)->where('id', '=', $id);
    $hide->delete();

    return redirect()->back();

}

public function documentsSentForApproval()
{

    $pendingDocuments = DB::table('approvals_document')
        ->select('documents.title', 'documents.content', 'documents.id as documentId', 
            'categories.category_type',
            'users.username', 'approvals_document.created_at',
            'approvals_document.id', 'approvals_document.approver_id', 'approvals_document.requestedBy')
        ->join('documents', 'documents.id', '=', 'approvals_document.document_id')
        ->join('categories', 'categories.id', '=', 'documents.category_id')
        ->join('users', 'users.id', '=', 'approvals_document.approver_id')
        ->where('approver_id', '=', Auth::id())
        ->where('documents.deleted_at', '=', null)
        ->orWhere('requestedBy', '=', Auth::id())
        ->orderBy('approvals_document.id', '=', 'desc')
        ->paginate(10);

    return view ('document.pending')
        ->with('pendingDocuments', $pendingDocuments);

}

person Francisunoxx    schedule 02.11.2016    source источник
comment
Как вы визуализировали строку таблицы? Я имею в виду, как вы получили свои Document записи в строке таблицы?   -  person krisanalfa    schedule 02.11.2016
comment
@Alfa Вы имели в виду, как я это запрашиваю? Чтобы получить все записи в моем ряду?   -  person Francisunoxx    schedule 02.11.2016
comment
Ага, а как вы это запросили?   -  person krisanalfa    schedule 02.11.2016
comment
Мягкое удаление работает только с Eloquent. Здесь вы используете построитель запросов. Замените -›where('documents.deleted_at', '=', null) на -›whereNull('documents.deleted_at')   -  person shoieb0101    schedule 02.11.2016
comment
@MD.MuntasirRahman ->whereNull('documents.deleted_at') по-прежнему возвращает мне то же представление, ничего не изменилось.   -  person Francisunoxx    schedule 02.11.2016
comment
Не могли бы вы изменить запрос на соединение следующим образом: -›join('documents', function ($join) { $join-›on('documents.id', '=', 'approvals_document.document_id') -›whereNull(' document.deleted_at'); })   -  person shoieb0101    schedule 02.11.2016
comment
@shoieb0101 shoieb0101 Эй, это хорошо работает. Можете ли вы опубликовать свой ответ, чтобы я мог принять его? Так что любой может иметь ссылку :D   -  person Francisunoxx    schedule 02.11.2016
comment
конечно, я разместил это как ответ :)   -  person shoieb0101    schedule 02.11.2016


Ответы (3)


Не могли бы вы изменить запрос на присоединение к приведенному ниже

->join('documents', function ($join) `{ $join->on('documents.id', '=','approvals_document.document_id') 
->whereNull('documents.deleted_at'); })`
person shoieb0101    schedule 02.11.2016
comment
Привет! Почему использование этого объединения ->join('documents', 'documents.id', '=', 'approvals_document.document_id') и добавление whereNull('documents.deleted_at') не сработает? Чем они отличаются? - person Francisunoxx; 02.11.2016
comment
@Francisunoxx, если вам нужно установить предложение where в объединенной таблице, оно должно быть во вложенном запросе. В противном случае, я думаю, он извлекает все записи из объединенной таблицы. - person shoieb0101; 02.11.2016
comment
Я думаю, что laravel сбивает с толку, когда вы его не вкладываете. Не уверен, хе-хе. - person Francisunoxx; 02.11.2016

Обратимое удаление не удалит строку. Он установит отметку времени для поля deleted_at, а красноречивый будет игнорировать любые строки, в которых установлено значение для поля deleted_at. Если вы реализовали обратимое удаление и хотите навсегда удалить строку, попробуйте использовать «forceDelete()».

$hide->forceDelete();
person shoieb0101    schedule 02.11.2016
comment
Но это удалит мои данные и больше не будет восстановлено. - person Francisunoxx; 02.11.2016
comment
Да, если вы хотите сохранить свои данные, просто используйте обычный метод удаления(). Это не приведет к удалению данных из базы данных, просто установите метку времени в поле delete_at. Когда вы делаете запрос через Eloquent, строки со значением в полях delete_at будут игнорироваться. Вы всегда можете получить обратимо удаленные строки и установить их как активные строки. источник - person shoieb0101; 02.11.2016

Вы не можете сравнивать значение NULL в Laravel SQL с помощью метода where. Вы можете использовать метод whereRaw:

public function documentsSentForApproval()
{

    $pendingDocuments = DB::table('approvals_document')
        ->select('documents.title', 'documents.content', 'documents.id as documentId', 
            'categories.category_type',
            'users.username', 'approvals_document.created_at',
            'approvals_document.id', 'approvals_document.approver_id', 'approvals_document.requestedBy')
        ->join('documents', function ($join) {
            $join->on('documents.id', '=', 'approvals_document.document_id')
                ->whereRaw('documents.deleted_at IS NULL');
        })
        ->join('categories', 'categories.id', '=', 'documents.category_id')
        ->join('users', 'users.id', '=', 'approvals_document.approver_id')
        ->where('approver_id', '=', Auth::id())
        ->orWhere('requestedBy', '=', Auth::id())
        ->orderBy('approvals_document.id', '=', 'desc')
        ->paginate(10);

    return view ('document.pending')
        ->with('pendingDocuments', $pendingDocuments);

}

Обновлять

Присоединение к обратимо удаленным записям должно быть изменено

person krisanalfa    schedule 02.11.2016
comment
Почему это удалило мою запись при добавлении whereRaw('documents.deleted_at IS NULL')? - person Francisunoxx; 02.11.2016
comment
Неправда: есть метод с именем whereNull(). - person Jan Willem; 02.11.2016
comment
@JanWillem, конечно, этот метод тоже сработает. но я предпочитаю whereRaw для увеличения детализации. - person krisanalfa; 02.11.2016
comment
@Francisunoxx Не следует удалять вашу запись из базы данных, потому что это операция только для чтения. Кстати, мой ответ решает вашу проблему? - person krisanalfa; 02.11.2016
comment
@Alfa Я не знаю, почему он удален из моей базы данных. Я еще раз проверю свой запрос. - person Francisunoxx; 02.11.2016
comment
@Francisunoxx Проверьте свой метод hideApprovalsDocument. Убедитесь, что вы используете delete, а не forceDelete. А также проверьте свой Document, вы должны использовать внутри него черту SoftDelete. - person krisanalfa; 02.11.2016
comment
@Alfa Да, я проверю мой метод hideApprovalsDocument. Я использовал здесь delete, а не forceDelete. Он просто полностью удалился при добавлении whereRaw('documents.deleted_at IS NULL') в мой скрипт. - person Francisunoxx; 02.11.2016
comment
@Francisunoxx Я считаю, что он не удаляется постоянно, он просто скрыт в вашем веб-приложении. Проверяли ли вы свою запись в базе данных с какого-либо клиента СУБД? - person krisanalfa; 02.11.2016
comment
@Alfa Не заметил, что я использовал forceDelete. Я изменил его на delete, но все равно никаких изменений. - person Francisunoxx; 02.11.2016
comment
Привет @Francisunoxx, я обновил ответ, пожалуйста, дайте мне знать. - person krisanalfa; 02.11.2016
comment
@Alfa Все еще анализирую ваш код :) На данный момент он выдает ошибку. Call to undefined method Illuminate\Database\Query\JoinClause::whereRaw(). У меня ошибка в whereRaw - person Francisunoxx; 02.11.2016