2015-12-18 90 views
2

我正在用laravel建立門票系統。但是當我取消票時,反應不會消失?laravel cascade不工作?

這是我的數據透視表的遷移:

public function up() 
    { 
     Schema::create('reactions_ticket',function(Blueprint $table) 
      { 
       $table->integer('ticket_id')->unsigned(); 
       $table->foreign('ticket_id')->references('id')->on('ticket')->onDelete('cascade'); 
       $table->integer('reactions_id')->unsigned(); 
       $table->foreign('reactions_id')->references('id')->on('reactions')->onDelete('cascade'); 
      }); 
    } 

這是我的反應表:

public function up() 
    { 
     Schema::create('reactions',function(Blueprint $table) 
      { 
       $table->increments('id'); 
       $table->integer('user_id')->unsigned(); 
       $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
       $table->text('content'); 
       $table->timestamps(); 
      }); 
    } 

和我的票表:

public function up() 
     { 
      Schema::create('ticket',function(Blueprint $table) 
      { 
       $table->increments('id'); 
       $table->string('slug')->nullable(); 

       $table->integer('ticketid')->unsigned(); 

       $table->integer('user_id')->unsigned(); 
       $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 

       $table->integer('subject_id')->unsigned(); 
       $table->foreign('subject_id')->references('id')->on('subject')->onDelete('cascade'); 

       $table->integer('websites_id')->unsigned(); 
       $table->foreign('websites_id')->references('id')->on('websites')->onDelete('cascade'); 

       $table->integer('status_id')->unsigned(); 
       $table->foreign('status_id')->references('id')->on('status')->onDelete('cascade'); 

       $table->text('content'); 
       $table->timestamps(); 
      }); 
     } 

我在做什麼錯>?

+0

你有softDeleting嗎? – ceejayoz

+0

感謝您的回覆。但爲什麼我應該這樣做?我只想刪除與該票相關的所有內容。當我去laravel docs時,它告訴我關於softDeleting的這個問題:「當軟刪除一個模型時,它實際上並沒有從你的數據庫中刪除。」這不是我想要的。 – Jamie

+0

如果你對'tickets'模型有softDeleting,那麼調用'delete()'就不會刪除它的關係。 – ceejayoz

回答

3

我總是喜歡自己處理這樣的操作,而不是讓MySQL由MySQL來完成。

你可以使用laravels事件處理您的Ticket模型內部。

protected static function boot() { 
    parent::boot(); 
    static::deleting(function($ticket) { 
     // delete related stuff ;) 
     $reaction_ids = $ticket->reactions()->lists('id'); 
     Reaction::whereIn($reaction_ids)->delete(); 
    }); 
} 

所以你還有(如果你想/需要)軟刪除和更多控制的優勢。

0

您在反應和門票之間有多次加入。因此,票可以有很多反應,並且反應可以有許多票。如果您刪除票證,我不希望刪除反應,因爲這些反應可能會附加到未刪除的其他票證。

什麼將被刪除都在該票數據透視表中的條目。如果你想清理所有不再有票據的反應,這將是一個單獨的任務,MySQL不會爲你級聯。

您的表名不是標準的,順便說一句。它們應該是透視表的票據,反應和reaction_ticket。