Поздний комментарий
Похоже, что единственный способ заставить это работать — определить столбцы внешнего ключа в формате 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]: Столбец не найден: 1054 Неизвестный столбец 'hotel_hotel_id' в 'списке полей' (SQL: вставить в значения
floors
(label
,hotel_hotel_id
,updated_at
,created_at
) (этаж № 1, 8, 2018 г. -03-22 12:37:39, 2018-03-22 12:37:39))
По-видимому, он ищет поле hotel_hotel_id
как столбец внутри таблицы floors
, что, как я подозреваю, добавляет имя таблицы в качестве префикса к имени столбца. Почему это происходит и как я могу предотвратить это и заставить всю систему не добавлять префикс ни к одному столбцу
не делая этого:
public function hotel()
{
return $this->belongsTo(\Otellier\Hotel::class, "hotels", "hotel_id", "hotel_id");
}
hotel_id
в$fillable
атрибутах себяFloor Model
- person Yves Kipondo   schedule 22.03.2018\Illuminate\Database\Eloquent\Model
? Вы можете изменить это? - person Jonas Staudenmeir   schedule 22.03.2018