我有很多关系。枢轴模型有很多孩子。当我在多对多上调用detach时,我还需要删除pivot模型的子节点。我想使用onDelete('cascade'),但这似乎不起作用。我也试过这个:http://laravel-tricks.com/tricks/using-model-events-to-delete-related-items,但这似乎也不起作用。两者都没有工作,可能是因为没有触发销毁事件。
关于在调用分离时如何让孩子删除的任何想法?
如果我犯了错误,这是我的一些代码:
我的支点模型:
Schema::create('beer_distributions', function(Blueprint $table)
{
$table->increments('id');
$table->integer('beer_id');
$table->integer('distributor_id');
枢轴模型的孩子:
Schema::create('kegs', function(Blueprint $table)
{
$table->increments('id');
$table->integer('beer_distribution_id');
$table->dropForeign('kegs_beer_distribution_id_foreign');
$table->foreign('beer_distribution_id')
->references('id')
->on('beer_distributions')
->onDelete('cascade');
我不知道是否还有挽救这种方法。我打电话给同步,然后试图删除孩子,没有意识到父母已经离开了让孩子们无法进入。:
$attachments = $beer->distributors()->sync(Input::get('distributors'));
foreach ($attachments['detached'] as $distributor_id) {
BeerDistribution::where('beer_id', '=', $id)
->where('distributor_id', '=', $distributor_id)->first()->destroy();
}
更新 为了清楚起见,我有四个与我合作的模型。啤酒和经销商有很多关系。枢轴模型BeerDistributions有许多小桶。当我调用同步来更新啤酒经销商时,BeerDistributions会自动被删除,我希望桶同时被删除。
以下是我的一些模特:
class Beer extends Eloquent {
public function distributors()
{
return $this->belongsToMany('Distributor', 'beer_distributions');
}
Beer ^ manyToMany with Distributor:
class Distributor extends Eloquent {
public function beers()
{
return $this->belongsToMany('Beer', 'beer_distributions');
}
枢轴模型......
class BeerDistribution extends Eloquent {
public function kegs()
{
return $this->hasMany('Keg', 'beer_distribution_id');
}
有很多小桶:
class Keg extends Eloquent {
public function beerDistribution()
{
return $this->belongsTo('BeerDistribution');
}
答案 0 :(得分:0)
这里似乎有一些关于数据透视表,分离和级联的混淆。
基本上,分离方法应该就是你所需要的。它所做的只是通过belongsToMany()
关系来管理数据透视表。
因此,如果$keg->distributors()->detach([1,2,3])
和$keg->id
为5,它将从分配器为1,2或3的数据透视表中搜索和删除项目,并且桶ID为5。在大多数情况下,你甚至不需要一个雄辩的模型用于数据透视表。 detach()
,attach()
和sync()
会为您处理该表格。
级联上的删除可能是导致您出现问题的原因,因为您将其向后移动。在这种情况下,级联键上的删除将放在数据透视表上。这意味着当您删除父项(桶或分发)时,将自动删除数据透视表中属于该父项的那些项。这样可以避免在表中显示孤立数据。
为什么我说你这样做是因为你把钥匙放在kegs
表上,这意味着当数据库表中的项目被删除时,你的桶也会被删除。这很糟糕,根本不是你想要的。删除桶时,您希望从数据透视表中删除项目。
删除该密钥并在您的架构中创建beerDistributions
添加两个看起来像这样的键......
$table->foreign('beer_id')->references('id')->on('beers')->onDelete('Cascade');
$table->foreign('distribution_id')->references('id')->on('distributors')->onDelete('Cascade');
如果您的经销商桌上有一个在级联上删除的密钥,请将其删除。只应在数据透视表上有这些外键。
编辑:看看你想如何删除kegs,看起来好像是在引用数据透视表中的错误列。
$table->foreign('id')
->references('beer_distribution_id')
->on('beer_distributions')
->onDelete('cascade');