分离不会触发级联

时间:2015-04-13 17:28:08

标签: php laravel orm cascade

我有很多关系。枢轴模型有很多孩子。当我在多对多上调用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');
  }

1 个答案:

答案 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');