嗨,我正在与多对多关系打交道,我想知道是否有什么方法可以删除主表的记录。
这些是我的桌子
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
中的内容。类似于级联删除,但从数据透视表中删除。
答案 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();
});
}