Laravel修改已存在Morph字段为可空报错:Call to a member function change() on null
问题解决:Laravel 修改已存在 Morph 字段为可空类型
错误原因
你使用的 nullableMorphs() 是用来创建新的可空多态关联字段的方法,它本身不会返回可调用 change() 的对象,因此才会触发 Call to a member function change() on null 错误。要修改已存在的 Morph 字段为可空,需要分别处理组成 Morph 关联的两个独立字段:cartable_type(字符串类型)和 cartable_id(整数类型)。
前置准备
Laravel 修改字段属性需要依赖 doctrine/dbal 包,先确保已安装:
composer require doctrine/dbal
正确的迁移代码
up 方法(修改为可空)
public function up() { Schema::table('table', function (Blueprint $table) { // 修改 cartable_type 为可空字符串 $table->string('cartable_type')->nullable()->change(); // 修改 cartable_id 为可空整数(如果你的字段是 unsignedInteger 则对应修改) $table->unsignedBigInteger('cartable_id')->nullable()->change(); }); }
down 方法(恢复为非可空)
public function down() { Schema::table('table', function (Blueprint $table) { // 注意:恢复前必须确保字段内无 NULL 值,否则数据库约束会报错 $table->string('cartable_type')->nullable(false)->change(); $table->unsignedBigInteger('cartable_id')->nullable(false)->change(); }); }
注意事项
- 如果你的 Morph 字段使用的是
unsignedInteger而非unsignedBigInteger,需对应调整字段类型。 - 执行回滚(down 方法)前,务必先清理字段中的 NULL 数据,否则会触发数据库约束错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

