Я использую красноречие с мягким удалением. Я получаю сообщение об ошибке, потому что мой запрос все еще выбирает данные, которые уже используют 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');
}






Вы можете ограничить нетерпеливую нагрузку:
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()')));
Хорошо, вот что происходит у меня, считать ...
При мягком удалении событие 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 Как вы имеете в виду, что вы начинаете с родительской модели? Если вы удаляете родительскую модель, вам, вероятно, в любом случае не следует удалять из нее модель пользователя, поскольку это отношение «один ко многим». Я не знаю, как выглядит ваш код. Но если есть случай, когда вы хотите удалить пользователя из родительского элемента, просто получите модель пользователя из родительского элемента, а затем вызовите функцию удаления для пользователя. $ parent = Parent :: find ($ parentId); $ user = Пользователь: .find ($ parent-> user_id); $ user-> delete (); или что-то подобное.
Конечно, вы можете переопределить функцию boot () в родительском элементе и добавить код для удаления связанных моделей пользователей. Но лично я считаю это плохой практикой. Было бы нелогично, если бы модель, которая принадлежит другой, удаляла бы модель, к которой она принадлежит, а затем эта модель, в свою очередь, удаляла бы первых моделей-братьев и сестер.
поэтому я не могу восстановить эти данные, когда уже использую static :: deleted, верно?
@TryHardz Если для ваших моделей установлено мягкое удаление, вы сможете восстановить его.
https://laravel.com/docs/5.7/eloquent#querying-soft-deleted-models
...
public function customerAddress()
{
return $this->hasOne(Addresses::class, "id", "id_address")->withTrashed();
}
...
после того, как я поставил $ this-> ownTo ('App \ User') -> whereNull ('users.deleted_at'); Я все еще получаю то же значение