Laravel,使用Detach()方法删除父记录

时间:2018-12-19 20:16:14

标签: php laravel laravel-5 eloquent

嗨,我正在与多对多关系打交道,我想知道是否有什么方法可以删除主表的记录。

这些是我的桌子

  Schema::create('inventario_inicial', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('producto_nombre_id')->unsigned();
        $table->foreign('producto_nombre_id')->references('id')->on('producto_nombre');
        $table->integer('existencias');
        $table->double('promedio');
        $table->timestamps();
    });
    Schema::create('empresa_inventario_inicial', function (Blueprint $table) {
        $table->integer('empresa_id')->unsigned();
        $table->foreign('empresa_id')->references('id')->on('empresas');
        $table->integer('inventario_inicial_id')->unsigned();
        $table->foreign('inventario_inicial_id')->references('id')->on('inventario_inicial');
    });

我可以使用此代码通过数据透视获取数据

$empresa = Empresa::find($request->empresa_id);
$empresa->inventario_inicial(); 

要分离$empresa的数据,我使用$empresa->inventario_inicial()->detach();

它删除了正确的数据透视表的记录,但是我不仅要删除empresa_inventario_inicial中的内容,而且要删除相关的inventario_inicial中的内容。类似于级联删除,但从数据透视表中删除。

1 个答案:

答案 0 :(得分:0)

您可以在迁移中使用$table->foreign('inventario_inicial_id')->references('id')->on('inventario_inicial')->onDelete('cascade')

如果您不想层叠,请考虑在删除empresa_inventario_official时使用模型events自动分离任何inventario_official数据透视记录,然后使用$empresa->inventario_inicial()->delete()方法代替您上面的detach()

App\InventarioOfficial中:

protected $dispatchesEvents = ['deleting' => InventarioDeleting::class];

然后,您可以定义事件和事件的侦听器:

App\Events\InventarioDeleting

class InventarioDeleting
{
    use SerializesModels;

    public $inventario_official;

    public function __construct(InventarioOfficial $inventario_official)
    {
       $this->inventario_official = $inventario_official;
    }
}

App\Providers\EventServiceProvider

public function boot()
{
    parent::boot();

    Event::listen(\App\Events\InventarioDeleting::class, function ($io) {
        DB::('empresa_inventario_inicial')->where('inventario_inicial_id',$io->id)->delete();
        //or $io->empresas()->detach();
    });
}