laravel cascade不工作?

时间:2015-12-18 20:11:06

标签: php laravel

我正在建造一个带有laravel的门票系统。但是当我取出机票时,反应不会消失?

这是我对数据透视表的迁移:

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();
            });
        }

我做错了什么>?

2 个答案:

答案 0 :(得分:4)

我总是喜欢自己处理这些操作,而不是让我的id完成。

您可以在Ticket模型中使用laravels event-handler。

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

所以你仍然拥有(如果你需要/需要)softdelete和更多控制的优势。

答案 1 :(得分:0)

你在反应和门票之间有很多人加入。因此,票可以有很多反应,反应可能有很多票。如果删除票证,我不希望删除这些反应,因为这些反应可以附加到其他未删除的票证上。

将删除的内容是该故障单的数据透视表中的条目。如果你想清除所有不再附带票证的反应,那将是一个单独的任务,mysql不会为你级联。

你的表名不是标准的,顺便说一句。它们应该是数据透视表的票据,反应和reaction_ticket。