【发布时间】:2018-08-31 22:23:20
【问题描述】:
迟来的评论
这样做的唯一方法似乎是以 table_name_primary_key 格式定义外键列。如果它们不适合这种格式,那么如果不指定列名,关系就无法工作。
我正在尝试学习如何通过 reliese/laravel 代码生成器使用外键(它从数据库生成模型),但我遇到了一个问题,迫使我在生成的代码中重新指定所有外键名称代码。这是我的迁移代码和生成的关系代码:
//迁移
Schema::create('hotels', function(Blueprint $table) {
$table->increments('hotel_id');
$table->string('name', 64);
$table->string('description', 512);
$table->softDeletes();
$table->timestamps();
});
Schema::create('floors', function(Blueprint $table){
$table->increments('floor_id');
$table->integer('hotel_id')->unsigned();
$table->string('label', 128);
$table->softDeletes();
$table->timestamps();
$table->foreign('hotel_id')->references('hotel_id')->on('hotels')->onDelete('cascade');
});
// 关系
// Hotel.php contains
public function floors()
{
return $this->hasMany(\Otellier\Floor::class);
}
// Floor.php contains
public function hotel()
{
return $this->belongsTo(\Otellier\Hotel::class);
}
现在,当我用 Faker 创建地板时:
$hotel = factory(App\Hotel::class)->make();
$floor = factory(App\Floor::class)->make([ "label" => "Floor #" . $floor_number ]);
$hotel->floors()->save($floor);
在最后一行,我得到这个错误:
Illuminate\Database\QueryException : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'hotel_hotel_id' in 'field list' (SQL: insert into
floors(label,hotel_hotel_id,updated_at,created_at) 值 (Floor #1, 8, 2018-03-22 12:37:39, 2018-03-22 12:37:39))
显然,它在floors 表中搜索hotel_hotel_id 字段作为列,我怀疑这是将表名添加为列名的前缀。为什么会发生这种情况,我该如何防止这种情况并强制整个系统不要为任何列添加前缀
不这样做:
public function hotel()
{
return $this->belongsTo(\Otellier\Hotel::class, "hotels", "hotel_id", "hotel_id");
}
【问题讨论】:
-
你有没有把
hotel_id放在你$fillable属性Floor Model中 -
是的,它在模型中定义
-
laravel 通常在外键前面加上你要添加外键的表名
-
但该错误与外键无关,与 Laravel 试图插入数据的列名有关。
-
你所有的模型都扩展
\Illuminate\Database\Eloquent\Model吗?你能改变它吗?
标签: laravel eloquent foreign-keys laravel-5.6