在我的Laravel应用程序中,如何通过以下设置创建新的父母和孩子?
class Parent extends Model
{
public function extended()
{
return $this->morphTo();
}
}
class Child extends Model
{
public function extendedFrom()
{
return $this->morphOne('App\Parent', 'extended');
}
}
class CreateParentsTable extends Migration
{
public function up()
{
Schema::create('parents', function (Blueprint $table) {
$table->increments('extended_id');
$table->string('extended_type');
});
}
}
class CreateChildrenTable extends Migration
{
public function up()
{
Schema::create('children', function (Blueprint $table) {
$table->unsignedInteger('id');
});
Schema::table('children', function (Blueprint $table) {
$table->foreign('id')
->references('extended_id')->on('parents')
->onDelete('cascade');
});
}
}
我试过了
$parent = new Parent();
$parent->save();
$child = new Child();
$parent->extended()->save($child);
但是这会产生以下错误
Builder.php第2161行中的BadMethodCallException:
调用未定义的方法Illuminate \ Database \ Query \ Builder :: save()
答案 0 :(得分:1)
如果您在此处查看API https://laravel.com/api/5.2/并搜索morphTo
,则可以看到它返回MorphTo
个对象。 https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Relations/MorphTo.html
如果您查看此类的方法,则可以看到此类上没有save
方法。您可能正在寻找的方法是associate
话虽如此,请尝试以下方法。
$parent->extended()->associate($child);
您的架构似乎也被打破了。 extended_id
不能是您的主键(通过increments
函数自动设置)和子ID。它需要一个id
列,auto_incrementing
并从auto_incrementing
中删除extended_id
。
以这种方式思考,这是多态的,因此多种类型的孩子可能具有相同的id
。在这种情况下,每个父母只能有一个孩子,因为extended_id
列是唯一的。
添加id
列,将其设置为主键并自动递增并将extended_id
设置为unsigned not null
仅适用于我,并且可以正确保存。
我还会查看您的数据库设置。您以前应该生成SQL错误,因为使用您设置的外键不可能。您可能无视某处的外键检查。