2014-09-29 4 views
0
class Ingredient extends Eloquent { 

    public function unit() { 
     return $this->hasOne('IngredientUnit', 'id', 'unit_id'); 
    } 

} 

class IngredientUnit extends Eloquent { 

    public function ingredient() { 
     return $this->belongsTo('Ingredient', 'unit_id', 'id'); 
    } 

    public function getNamesAttribute() { 
     $quantity = $this->ingredient()->quantity; // <- ErrorException 

     ... 
    } 

} 

ErrorException (E_UNKNOWN):Получить свойство связи в модели

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$quantity 

Если удалить скобки - $this->ingredient->quantity; - я

ErrorException (E_UNKNOWN)

Trying to get property of non-object 

Как я могу получить свойство объекта отношения (принадлежит Too)?


Schemas:

Schema::create('ingredients', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->integer('recipe_id')->unsigned(); 
     $table->integer('unit_id')->unsigned()->nullable(); 
     $table->float('quantity')->unsigned(); 
     ... 
    }); 

    Schema::create('ingredient_units', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->string('name'); 
     ... 
    }); 

ответ

1

С помощью этих таблиц ваших отношений ошибаются.

Вам необходимо их поменять, так как это выглядит следующим образом: unit hasOne/hasMany ingredients, ingredient belongsTo unit.

// Ingredient 
public function unit() 
{ 
    return $this->belongsTo('IngredientUnit', 'unit_id', 'id'); 
} 

// IngredientUnit - I don't think it's hasOne, rather hasMany 
public function ingredients() 
{ 
    return $this->hasMany('Ingredient', 'unit_id', 'id'); 
} 

Далее, это не может работать:

$this->ingredient()->quantity; 

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

$this->ingredient->quantity; 

Так в основном у вас нет соответствующего ингредиента, поэтому он возвращает null, и вы получите ошибку.

+0

Отношение хорошее Ингредиент (id, quantity, unit_id, ...) | IngredientUnit (id, name, ...). Laravel docs: 'return $ this-> hasOne ('Phone', 'foreign_key', 'local_key');' so 'unit_id' является внешним и' id' является локальным – Shaddow

+0

Я не понимаю вашу точку зрения. Если вы говорите, что 'Ingredient' имеет поле' unit_id', то и ваши отношения неверны. Таким образом, самый простой способ заключается в совместном использовании схемы таблиц. –

+0

ok Я выложу схемы ... но все работает для меня, кроме этой модели, внутри использования отношения – Shaddow

0

Во-первых, вы должны изменить:

$quantity = $this->ingredient()->quantity; 

в

$quantity = $this->ingredient->quantity; 

Но в случае, если нет Ингредиент не найден, вы получите исключение, так что вы должны лучше изменить его на:

$ingredient = $this->ingredient; 
$quantity = ($ingredient) ? $ingredient->quantity : 0; 

назначить 0, если ингредиент не найден;

+0

у него всегда есть 'ингредиент', потому что его принадлежит ингредиенту, он не может существовать один, но если мы проигнорируем этот факт, его возвращение 0 теперь. В поле зрения я пытаюсь вызвать '{{$ componentient-> unit-> names}}' – Shaddow

Смежные вопросы