所以我在两个模型之间有关系
class Projects extends Model implements Auditable
{
use SoftDeletes;
use \OwenIt\Auditing\Auditable;
protected $fillable = [
'name', 'active'
];
public function boards(){
return $this->belongsTo(Board::class);
}
}
和
class Board extends Model
{
protected $guarded = [];
public function projects(){
return $this->hasMany(Projects::class);
}
}
我想在不删除关系的情况下将董事会从其项目中清空。 我认为这段代码可以解决问题:
$board->projects()->delete()
但是我最终删除了关系。
我现在的问题是如何恢复关系,而在不实际删除关系的情况下清空关系的最佳方法是什么?
编辑:进一步解释 假设我有4个项目属于一个董事会。我如何在不知道项目ID的情况下一次清除所有这些?
答案 0 :(得分:1)
我认为您可能能够恢复关系,因为您正在Projects
模型中使用软删除。您可以通过运行:
$board->projects()->withTrashed()->restore();
请注意在查询上使用withTrashed()
方法。它将返回软删除的项目。
您可以通过在board_id
表中将projects
设置为空并将该board_id
设置为null
来“清空”该关系。
您可以运行以下命令来批量更新项目:
$board->projects()->update(['board_id' => null]);
编辑:您也可以通过运行$board->projects()->detach();
实现批量更新,如@ common-sense所述。
答案 1 :(得分:0)
如果没有任何备份或不使用Laravel的Soft Delete功能,则无法从数据库恢复已删除的数据。
如果已经使用过此功能,则可以从db或
->withTrashed()
恢复数据 方法。
通常,Laravel通过$board->projects()->delete()
删除所有关系数据,但是我不明白您的问题。当您运行$board->projects()->delete()
命令时,发生了什么?通常,在使用它时,应该从项目表中删除所有projects
。
注意; ,对于下一次删除操作,您可能需要使用 DB::transaction确保删除关系数据。
编辑;
在删除板时是否要删除关系项目数据,可以使用以下方法。
DB::transaction(function () use ($board) {
$board->projects()->delete();
$board->delete();
});
以上代码,如果正确删除了项目,则删除给定的板。如果删除时出现问题,由于DB::transaction
,它不会删除任何内容。