意外删除的关系laravel

时间:2019-01-23 12:42:49

标签: php laravel laravel-5

所以我在两个模型之间有关系

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的情况下一次清除所有这些?

2 个答案:

答案 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,它不会删除任何内容。