【问题标题】:laravel cascade not working?laravel 级联不工作?
【发布时间】:2015-12-18 20:11:06
【问题描述】:

我正在使用 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();
            });
        }

我做错了什么>?

【问题讨论】:

  • 你有软删除吗?
  • 感谢您的回复。但我为什么要这样做?我只想删除与该票相关的所有内容。当我转到 laravel 文档时,它告诉我有关 softDeleting 的信息:“当软删除模型时,它实际上并没有从您的数据库中删除。”这不是我想要的。
  • 如果你的tickets 模型上有softDeleting,调用delete() 不会删除它的关系。
  • 好的,但是检查了一下,我的 Ticket 模型中没有 softDeleting。
  • 看起来如果你要删除一个反应票证,票证和反应都会被删除,但如果你删除一个票证,我看不到级联会发生在哪里。

标签: php laravel


【解决方案1】:

我总是更愿意自己处理这些操作,而不是让 id 由 MySQL 完成。

您可以在 Ticket 模型中使用 laravel 事件处理程序。

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

所以您仍然拥有(如果您想要/需要)软删除和更多控制的优势。

【讨论】:

    【解决方案2】:

    您在反应和票证之间有一个多对多的连接。因此,一张票可以有很多反应,而一个反应可以有很多票。如果您删除工单,我不希望删除反应,因为这些反应可能会附加到其他未删除的工单。

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 2021-04-30
      • 1970-01-01
      • 2016-01-03
      • 2017-04-24
      • 2023-02-08
      • 2017-01-13
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多