onDelete('cascade')对Laravel 5.6没有影响

时间:2018-06-15 12:04:58

标签: php laravel orm eloquent laravel-5.6

Laravel 5.6 mysql 14.14

我正在尝试使用 OnDelete('cascade'),但它没有效果! - 当我删除帖子时,必须删除相应的照片。但是级联不起作用。 (该帖子已被删除,但数据库中的照片条目未被删除,我没有收到任何错误)

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('photo_id')->index();
        $table->foreign('photo_id')->references('id')->on('photos')->onDelete('cascade');
        $table->engine = 'InnoDB';
    });
}


public function up()
{
    Schema::create('photos', function (Blueprint $table) {
        $table->increments('id');
        $table->engine = 'InnoDB';
    });
}


class Post extends Model
{
    protected $fillable = [
        'photo_id',
    ];

    public function photo()
    {
        return $this->belongsTo('App\Photo');
    }
}

class Photo extends Model
{
    public function post()
    {
        return $this->hasOne('App\Post');
    }
}

mysql> show engines;
+--------------------+---------+---------------------------------------------    -------------------+--------------+------+------------+
| Engine             | Support | Comment                                                            | Transactions | XA   | Savepoints |
+--------------------+---------+---------------------------------------------    -------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking,     and foreign keys     | YES          | YES  | YES        |


mysql> SHOW CREATE TABLE posts;
| posts | CREATE TABLE `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`photo_id` int(10) unsigned NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `posts_photo_id_index` (`photo_id`),
CONSTRAINT `posts_photo_id_foreign` FOREIGN KEY (`photo_id`) REFERENCES   `photos` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4     COLLATE=utf8mb4_unicode_ci |

2 个答案:

答案 0 :(得分:0)

这个问题的一个可能的解释是你的外键约束不存在,尽管你说迁移文件中必须有一个。它来自于存储引擎未设置为INNODB的事实。

但是我看到你在迁移中写了$table->engine = 'InnoDB';,所以我认为它会起作用。但您可以通过键入以下命令来检查您的存储引擎是否为INNOBD:

SHOW ENGINES;

如果您发现INNODB不是您的默认引擎,请在MySQL CLI中输入:

SET GLOBAL default_storage_engine=INNODB

然后重新运行您的迁移,级联删除应该有效。

答案 1 :(得分:0)

根据您的关系结构,当您删除photo时,这将级联到posts表,以查看外国约束是否失败,因为事实证明是,有一个帖子,参考这张照片,然后该帖子也会被删除。

考虑一下,

posts:
- id
- title
- body

photos:
- id
- path
- post_id - references id on posts with onDelete('cascade')

使用此结构,如果删除帖子,您可以删除照片。

或者,如果你不想改变结构。您可以考虑删除laravel一侧的相关照片,您可以使用deleting模型事件手动删除相关照片。这有助于确保每当删除帖子时,相关照片都会被删除。