Как я могу использовать мягкое удаление с отношением

Я использую красноречие с мягким удалением. Я получаю сообщение об ошибке, потому что мой запрос все еще выбирает данные, которые уже используют softdelete, вот моя модель

Модель пользователя

class User extends Authenticatable
{
    use Notifiable, HasRoles, SoftDeletes;
    protected $guard_name = 'web';
    protected $fillable = [
        'username', 'password'
    ];
    protected $dates = ['deleted_at'];

}

например, у меня 100 пользователей, и я удалил 1 пользователя с помощью softdelete. тогда я пытаюсь

$a = User::all();
dd($a);

У меня 99 пользователей. Оно работает! но после того, как я использую это отношение, он действительно работает здесь, что я делаю

Это моя родительская таблица и модель

стол

 |id|user_id|parent_id|

Примечание: user_id и parent_id - это FK в таблице user.id

class Parent extends Model
{
    protected $table = 'parent';
    public function user()
    {
        return $this->belongsTo('App\User');
    }

}


$getParent = Parent::with('user')->get();

когда я использую dd($getParent);, почему я до сих пор получаю нулевые данные от user_id, которые я уже использую с мягким удалением?

Пользователь модели ОБНОВИТЬ: после того, как я поставил whereNull, я все еще получаю пользователя, которого я уже мягко удалил

public function user()
{
    return $this->belongsTo('App\User')->whereNull('users.deleted_at');
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
3 703
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете ограничить нетерпеливую нагрузку:

public function groups()
{

    return $this
    ->belongsToMany('Group')
    ->whereNull('group_user.deleted_at') // Table `group_user` has column `deleted_at`
    ->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at`

}

Вместо ЖЕСТКОГО удаления отношения, используя:

User::find(1)->groups()->detach();

Вместо этого вы должны использовать что-то вроде этого для МЯГКОГО удаления:

DB::table('group_user')
->where('user_id', $user_id)
->where('group_id', $group_id)
->update(array('deleted_at' => DB::raw('NOW()')));

после того, как я поставил $ this-> ownTo ('App \ User') -> whereNull ('users.deleted_at'); Я все еще получаю то же значение

TryHardz 17.10.2018 06:35
Ответ принят как подходящий

Хорошо, вот что происходит у меня, считать ...

При мягком удалении событие ondelete не работает (это означает, что связанные модели не удаляются). Я не уверен, изменилось ли это в более поздних версиях Laravel, но я так не думаю. Также удаление пользователя по-прежнему не повлияет на родительскую модель, поскольку вы не определили отношения между пользователем и родительским (в модели пользователя), только между родительским элементом и пользователем.

Попробуйте определить отношения в User, а затем переопределите функцию boot (), которая находится в классе Model. (Это непроверенный код, но что-то вроде этого должно сработать)

class User extends Authenticatable
{
    use Notifiable, HasRoles, SoftDeletes;
    protected $guard_name = 'web';
    protected $fillable = [
        'username', 'password'
    ];
    protected $dates = ['deleted_at'];

    // Override Model boot function
    protected static function boot()
    {
        parent::boot();

        static::deleting(function ($users) {
            foreach ($users->parents()->get() as $parent) {
                $parent->delete();
            }
        });
    }

    // Define relationship with parent model
    public function parents()
    {
        $this->hasMany('App\Parent');
    }
}

Спасибо за эту работу, но есть ли способ переопределить функцию boot () в родительской модели? потому что во многих запросах я начинаю с родительской модели

TryHardz 17.10.2018 08:41

@TryHardz Как вы имеете в виду, что вы начинаете с родительской модели? Если вы удаляете родительскую модель, вам, вероятно, в любом случае не следует удалять из нее модель пользователя, поскольку это отношение «один ко многим». Я не знаю, как выглядит ваш код. Но если есть случай, когда вы хотите удалить пользователя из родительского элемента, просто получите модель пользователя из родительского элемента, а затем вызовите функцию удаления для пользователя. $ parent = Parent :: find ($ parentId); $ user = Пользователь: .find ($ parent-> user_id); $ user-> delete (); или что-то подобное.

Christoffer 17.10.2018 08:48

Конечно, вы можете переопределить функцию boot () в родительском элементе и добавить код для удаления связанных моделей пользователей. Но лично я считаю это плохой практикой. Было бы нелогично, если бы модель, которая принадлежит другой, удаляла бы модель, к которой она принадлежит, а затем эта модель, в свою очередь, удаляла бы первых моделей-братьев и сестер.

Christoffer 17.10.2018 09:38

поэтому я не могу восстановить эти данные, когда уже использую static :: deleted, верно?

TryHardz 18.10.2018 06:36

@TryHardz Если для ваших моделей установлено мягкое удаление, вы сможете восстановить его.

Christoffer 18.10.2018 09:42

https://laravel.com/docs/5.7/eloquent#querying-soft-deleted-models

...
    public function customerAddress()
    {
        return $this->hasOne(Addresses::class, "id", "id_address")->withTrashed();
    }
...

Другие вопросы по теме