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 |
答案 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
模型事件手动删除相关照片。这有助于确保每当删除帖子时,相关照片都会被删除。