2016-11-18 5 views
0

У меня есть модель House и модель energy_class.Laravel Eloquent Relationship Undefinded Недвижимость

Дом имеет только один энергетический класс. Классы энергии могут быть назначены для нескольких домов. Поэтому я определил отношения, как это:

House.php

class House extends Model 
{ 
    public function energy_class() 
    { 
     return $this->hasOne('App\energy_class', 'id', 'energy_class'); 
    } 
} 

energy_class.php

class energy_class extends Model 
{ 
    public function house() 
    { 
     return $this->belongsToMany('App\House'); 
    } 
} 

При переходе дом данных к виду, как это:

$house = House::with('energy_class')->find($id); 
return view('admin.houses.edit')->with('house', $house); 

И ссылаясь на это на вид вот так:

$house->energy_class()->name 

Я получаю эту ошибку: Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$name

Когда делают это так: $house->energy_class->name я trying to get property of non-object

+0

Можете ли вы показать имена таблиц и имена столбцов для базы данных. –

+0

Таблицы: 'house',' energy_classes'. Столбцы: 'house.energy_class',' energy_classes.name' – Scarwolf

ответ

2

Ваше первое предложение:

$house->energy_class()->name 

не работает, потому что в этот момент вы только назвал отношения, вы еще не указали из этого, что вы хотели, например:

$house->energy_class()->first() 

Ваша вторая попытка возвращает пустое значение, потому что $ house-> energy_class (что делает то же, что и приведенный выше код), не возвращает никаких результатов.

Там могут быть различные причины для этого:

  • Ваши отношения не правильно подписался
  • Ваша база данных не правильно установлен (? Есть настройки внешнего ключа в вашей миграции)
  • В доме фактически нет энергетического класса, заполненного

Я подозреваю, что в вашем случае это может быть второй или третий. Не могли бы вы вставить мне свой сценарий миграции?

Редактировать: PS. если эта ошибка возникает, потому что, возможно, не у каждого дома есть энергетический класс, вы можете использовать следующий код для проверки:

$house->energy_class ? $house->energy_class->name : "No energy class available"; 
+0

Вот часть миграции: '$ table-> integer ('energy_class') -> unsigned(); $ table-> foreign ('energy_class') -> ссылки ('id') -> on ('energy_classes'); 'Дом, который я пытаюсь редактировать, имеет энергетический класс с набором id 1, который относится к классу с имя 'A ++' – Scarwolf

+0

'$ house-> energy_class() -> first() -> name' работает. Но не должно быть возможно без 'first()' Потому что отношения должны сказать laravel, что есть только одна связанная запись ... – Scarwolf

+0

Странно, что имя $ house-> energy_class-> не работает, но ваше предложение действительно работает.Рад слышать, что у вас есть информация, в которой вы нуждаетесь! Причина, по которой вы все еще должны сначала просить, состоит в том, что доступны различные другие варианты (например, firstOrFail, firstOrCreate). – visscher