Вопросы, связанные с мягким удалением в laravel

У меня есть несколько вопросов, касающихся мягкого удаления в laravel. У меня есть поиск по тому, что он делает и что это значит, и самая понятная часть мягкого удаления из этого предложения

«При обратимом удалении моделей они на самом деле не удаляются из вашей базы данных. Вместо этого для модели устанавливается атрибут delete_at, который вставляется в базу данных. Если модель имеет ненулевое значение delete_at, модель была обратимо удалена. Чтобы включить обратимое удаление для модели, используйте трейт Illuminate\Database\Eloquent\SoftDeletes в модели и добавьте столбец delete_at в свое свойство $dates:

Итак, вот мои вопросы, основанные на этом предложении:

Q1:

Итак, когда я использую мягкое удаление в своем коде и когда я пытаюсь удалить некоторые данные, исчезают ли данные на странице просмотра (blade.php), в то время как база данных все еще содержит эти данные?

Q2:

Я видел, как некоторые люди использовали что-то под названием static::deleting, я не совсем понимаю, как это работает? Не могли бы вы объяснить, что он делает? Спасибо

Q3:

Как вы удаляете данные с помощью мягкого удаления? Я видел, как люди просто добавляли некоторые вещи в свою модель вместо использования кнопки, значит ли это, что вы можете удалить их только вручную внутри модели, а не просто нажимать кнопку удаления на странице просмотра?


person blastme    schedule 27.10.2017    source источник


Ответы (5)


Вопрос 1

По умолчанию: Да.
Это зависит от вашего запроса. При использовании обратимого удаления Laravel будет запрашивать все модели, которые по умолчанию не обратимо удалены. Если вы также хотите получить модели с обратимым удалением, вам нужно вызвать метод withTrashed() в вашем запросе. Подробнее читайте здесь:
https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models

Чтобы понять, что делает withTrashed(), вам нужно понять, как работает обратимое удаление. Модели с обратимым удалением работают путем добавления нового столбца в таблицы вашей базы данных с именем deleted_at. По умолчанию это значение равно null. Когда вы мягко удаляете модель, Laravel помещает текущую метку времени в этот столбец. Поэтому это поле больше не содержит пустого значения.

При запросе моделей при использовании мягкого удаления Laravel добавляет к запросу условие deleted_at is null. Вызов метода withTrashed() удаляет это условие из запроса.

Взгляните на источник модификатора запроса по умолчанию и метод withTrashed.


вопрос 2

Это события. Вы можете вызвать это, чтобы сообщить Laravel, что он должен выполнить это конкретное закрытие, когда произойдет это событие. В вашем примере он прослушивает событие «удаление». Подробнее об этом читайте здесь:
https://laravel.com/docs/5.5/eloquent#events


Вопрос 3

Вы можете полностью удалить обратимо удаляемые модели с помощью метода forceDelete(). См. «Безвозвратное удаление моделей» здесь:
https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models

person festie    schedule 27.10.2017
comment
для метода withTrashed, что он делает? Ресурсы только говорят мне, что он используется только для целей отношений, но не могли бы вы объяснить мне больше? Спасибо - person blastme; 27.10.2017
comment
Итак, когда я создаю столбец для обратимого удаления, мне нужно поместить его для всех других моих таблиц, которые имеют отношения? Или я просто кладу его за стол, который подключается к другим столам? - person blastme; 27.10.2017
comment
Только для таблицы модели, которую вы хотите мягко удалить. Например, если у вас есть Post и Comment, а комментарии подлежат обратимому удалению, вам нужно только добавить этот столбец в таблицу comments. - person festie; 27.10.2017
comment
А как насчет родительской таблицы? Если я поставлю мягкое удаление, появится ли эта ошибка? Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не работает - person blastme; 27.10.2017
comment
Нет. Вы не получите такой ошибки, потому что исходные данные все еще существуют на своем месте, когда вы их обратимо удаляете. Вы можете получить ошибки, когда окончательно удалите данные, но это зависит от настройки вашей базы данных и не имеет ничего общего с обратимым удалением. - person festie; 27.10.2017
comment
Ааа, понятно, большое спасибо за то, что помогли мне понять, еще одна вещь, есть ли у вас какое-либо обучающее видео или веб-сайт, который дает пример того, как шаг за шагом выполнять обратимое удаление? Ссылки, которые вы дали в своем вопросе, я уже прочитал их, но мне кажется, что они дали слишком мало информации. - person blastme; 27.10.2017
comment
Я знаю (и рекомендую) только Laracasts с Джеффри Уэем. Большинство уроков платные, но, на мой взгляд, оно того стоит. Если не хотите тратить деньги, попробуйте поискать на YouTube. - person festie; 27.10.2017
comment
хахаха, потому что на YouTube не так много видео об этом, поэтому я публикую здесь, но в любом случае большое спасибо за вашу помощь - person blastme; 27.10.2017
comment
Большое спасибо, посмотрю позже :) - person blastme; 27.10.2017

Вопрос 1. Итак, когда я использую обратимое удаление в своем коде и пытаюсь удалить некоторые данные, исчезают ли данные на странице просмотра (blade.php), в то время как база данных все еще содержит эти данные?

да. Мягкое удаление заполняет столбецDeleted_at в базе данных. С тех пор Eloquent не будет извлекать эти данные (кроме случаев, когда вы попросите об этом). Если вы используете пользовательский запрос SQL, вам необходимо добавить WHERE deleted_at IS NULL

Q2: Я видел, как некоторые люди использовали что-то под названием static::deleting, я не совсем понимаю, как это работает? Не могли бы вы объяснить, что он делает? Спасибо

Я не использую это изо дня в день, но это событие, которое вы можете вызвать (см. orm">здесь ) для автоматического удаления связанного контента (например, если вы удаляете пользователя, вы также можете удалить все его сообщения. Это своего рода каскадное удаление)

Q3: Как вы удаляете данные с помощью обратимого удаления? Я видел, как люди просто добавляли некоторые вещи в свою модель вместо использования кнопки, значит ли это, что вы можете удалить их только вручную внутри модели, а не просто нажимать кнопку удаления на странице просмотра?

Чтобы использовать обратимое удаление, вы просто $object->detroy($id) или $myEloquentRequest->where(...)->delete() Если вы хотите принудительно выполнить реальное удаление (чтобы записи были окончательно удалены из базы данных), вы можете использовать $flight->forceDelete(); См. здесь, чтобы узнать больше. Вы можете сделать удаление, где вы хотите. Щелчок по кнопке приводит пользователя к методу delete() в вашем контроллере. Вы можете удалить там или вызвать метод внутри модели, чтобы вызвать удаление (и, возможно, более сложное удаление, например, событие...)

person JérémyCasper    schedule 27.10.2017
comment
Должен ли я добавлять это в таблицу моей базы данных для столбцаDeleted_at? Или он просто сделает это за меня автоматически? Или просто поместите его внутрь моей модели (которую я видел, как некоторые люди что-то защищали)? - person blastme; 27.10.2017
comment
Вы должны добавить его. Если вы используете миграцию, вы можете просто добавить $table->softdeletes() - person JérémyCasper; 27.10.2017
comment
Извините, я сейчас сбит с толку, я думал, что должен поместить столбец delete_at внутрь? почему софтудалеты? - person blastme; 27.10.2017
comment
В вашей таблице в вашей базе данных вам нужно иметь столбец delete_at, например столбец updated_at или created_at (если вы их используете). Если вы используете файл миграции внутри Laravel, вы можете использовать строку выше, чтобы автоматически создать этот столбец. - person JérémyCasper; 27.10.2017
comment
О, хорошо, я думаю, я понял, что вы имеете в виду, после того, как вы добавили $table-›softdeletes(), появится столбецDeleted_at? - person blastme; 27.10.2017
comment
Вы запускаете миграцию (php artisan migrate в консоли), а затем да. Просто учтите, что если ваша таблица уже существует, вам нужно создать новый файл миграции, чтобы изменить таблицу (или запустить php artisan migrate:refresh, но он удалит ваши текущие данные) - person JérémyCasper; 27.10.2017

Мягкое удаление означает, что записи в базе данных не удаляются. Поэтому мы обрабатываем один флаг для управления записями, удалены они или нет.

Давайте я объясню больше с примерами:

В наших записях много пользователей, поэтому мы добавляем одно поле delete_at в базу данных и по умолчанию его значение равно нулю, поэтому его записи не удаляются.

Теперь, когда мы извлекаем все пользовательские данные, мы пишем запрос вроде

Select * from user where delete_at = null

Таким образом, этот запрос возвращает все пользовательские данные, которые не удаляются.

Теперь мы удаляем этого пользователя, поэтому, когда мы нажимаем кнопку «Удалить», мы создаем собственный запрос и обновляем поля этого пользователя delete_at с текущей датой и временем.

Update delete_at=date() where user_id = 1

так что теперь эти записи подлежат мягкому удалению.

Теперь я отвечаю на ваш вопрос:

Q.1) Никакие данные не отображаются после мягкого удаления, потому что, когда мы извлекаем данные, они проверяют поля delete_at на null или нет.

person bipin patel    schedule 27.10.2017
comment
о, я понимаю, тогда есть ли какой-нибудь метод, с помощью которого я мог бы нажать кнопку удаления, и исчезнет только представление, связанное с этими данными, но данные базы данных останутся - person blastme; 27.10.2017
comment
Если вы используете мягкое удаление, просто обновите значение полей delete_at, но данные вашей базы данных останутся прежними. - person bipin patel; 27.10.2017
comment
если вам нравится мой ответ, вы можете принять этот ответ, чтобы помочь другому лучше понять - person bipin patel; 27.10.2017

уточнение ваших моментов. 1. Таким образом, когда мы используем обратимое удаление в коде, delete_at будет обновлен, чтобы представить метку времени с нуля, поэтому при запросе данных из этой конкретной таблицы из любого места вашего проекта красноречиво модель будет автоматически возвращать данные, чье значение delete_at равно NULL, т. е. они не подлежат обратимому удалению.

  1. люди используют что-то под названием static::deleting. вы могли видеть что-то вроде этого примера, если я правильно понимаю ваш вопрос:

    класс X-Model расширяет Eloquent {

    public function xy()
    {
        return $this->has_many('XY_Model');
    }
    
    // this is a recommended way to declare event handlers
    protected static function boot() {
        parent::boot();
    
        static::deleting(function($x) { 
         // before delete() method call this
             $user->xy()->delete();
             // do the rest of the cleanup...
        });
    }
    

    } Это пример использования событий Eloquent для удаления записи, которая будет использовать событие «удаление» для очистки.

  2. удалить данные с помощью обратимого удаления

теперь после вызова этого вы можете мягко удалить данные из таблицы, а также вы можете мягко удалить данные из других зависимых таблиц, если отношения в моделях поддерживаются должным образом. это на самом деле известно как каскадный эффект. пример для понимания. Структура модели:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Utilities\Uuids;
use Illuminate\Database\Eloquent\SoftDeletes;
use Iatstuti\Database\Support\CascadeSoftDeletes;

class XFolder extends Model
{
    use SoftDeletes, CascadeSoftDeletes;
    use Uuids;
    protected $connection = 'XDB';
    protected $table = 'x_folder';
    protected $dates = ['deleted_at'];
    public $incrementing = false;
    protected $cascadeDeletes = ['XReference']; //related table with foreign keys
    protected $visible = [ 'id', 'x_id', 'xz_id', 'at_id', 'title', 'description', 'description', 'status', 'created_on' , 'is_active'];

    protected $fillable = [
     'x_id',
     'xz_id',
     'at_id',
     'title',
     'description',
     'status',
     'created_on',
     'is_active'
    ];

    public function XReference()
    {
        return $this->hasMany('App\Models\XReference', 'x_id');
    }
}

теперь в контроллере можно вызывать так:

public function deleteData($id)
    {
        $results = $this->getModel()->where('id', $id)->deleteData();
        return $results;
    }

это приведет к удалению данных (мягкое удаление в каскадном формате).

person piyush    schedule 16.05.2018

Q1: То есть, когда я использую обратимое удаление в своем коде и пытаюсь удалить некоторые данные, исчезают ли данные на странице просмотра (blade.php), в то время как база данных все еще содержит эти данные?

Да, если в вашей модели используется softDelete, то поисковый запрос будет таким: Select * from table_name where delete_at = null

Q2: Я видел, как некоторые люди использовали что-то под названием static::deleting, я не совсем понимаю, как это работает? Не могли бы вы объяснить, что он делает?

Вы можете сделать это с помощью: Modelname::destroy($id) статического действия

Он уничтожает объект модели, в котором установлен $id. При уничтожении я имею в виду: он обновляет столбец deleted_at, поэтому приложение увидит его как мягко удаленный объект.

Q3: Как вы удаляете данные с помощью обратимого удаления? Я видел, как люди просто добавляли некоторые вещи в свою модель вместо использования кнопки, значит ли это, что вы можете удалить их только вручную внутри модели, а не просто нажимать кнопку удаления на странице просмотра?

Пример одного из моих проектов:

У меня есть кнопка удаления на экране партнера, что направляет на partner/{{ id }}/delete

на маршрутах: Route::get('/partner/{id}/delete', 'PartnerController@deletePartner');

Что идет на это действие:

public function deletePartner($partnerId = 0){

    if ($partnerId > 0){
        Partner::destroy($partnerId);
    }

    return redirect("/partner");
}

Итак: если я нажимаю кнопку «Удалить», она проверяет, установлен ли идентификатор, а затем «уничтожает его» (мягкое удаление). После удаления перенаправляет обратно на партнера

ИЗМЕНИТЬ:

Для примера, приведенного в вопросе 3, когда вы удаляете данные, данные базы данных исчезают или только представление?

Он исчезнет только из поля зрения. В базе данных он будет храниться как:

id name ... created_at       updated_at       deleted_at
1  foo  ... 2017-10-01 00:00 2017-10-01 00:00 NULL
2  bar  ... 2017-10-01 00:00 2017-10-01 00:00 2017-10-25 16:00

Первый — неудаленный, второй — объект с обратимым удалением, и в представлении будет отображаться только первый.

person Feralheart    schedule 27.10.2017
comment
Для примера, приведенного в вопросе 3, когда вы удаляете данные, данные базы данных исчезают или только представление? - person blastme; 27.10.2017
comment
Хорошо, просто спрашиваю, знаете ли вы какие-либо обучающие видеоролики или веб-сайты, которые дают пример того, как шаг за шагом выполнять обратимое удаление? - person blastme; 27.10.2017
comment
Многое можно узнать из документации. Это часть мягкого удаления. Также вы можете многому научиться на Laracast. У них много видеоуроков. Это касается мягкого удаления. - person Feralheart; 27.10.2017
comment
хахаха документацию я уже прочитал, но в любом случае большое спасибо за вашу помощь :) - person blastme; 27.10.2017