2014-05-26 3 views
0

Почему реальность должна быть такой сложной? lolВопрос о взаимоотношениях с Laravel

Я пытаюсь получить imageName из модели Petphoto, которая прикреплена к модели Pet. В моем контроллере я добавляю модель Petphoto, используя с(), но когда я иду на вывод ее с помощью $ pet-> photo-> imageName, ее высказывание: Undefined property: Illuminate\Database\Eloquent\Collection::$imageName

Когда я просто использую $ pet-> фотографию, HTML который создается в [{"imageID":114,"petID":189,"imageName":"P3080066.JPG","dateAdded":"2011-05-27 00:00:00","source":"local","weight":1}]

Мой контроллер:

$pets = Pet::with('photo','breed','secondbreed')->where('status',1)->paginate(50); 

My Pet Модель:

public function photo(){ 
    return $this->hasMany('Petphoto', 'petID', 'petID'); 
} 

Мои Petphoto Модель:

public function pet(){ 
     return $this->belongsTo('Pet'); 
    } 

Любые идеи, что я делаю неправильно? Благодаря!

ответ

1

Отношения так чертовски легко с красноречивым, вы только что сделали их немного сложнее;)

Сначала я предлагаю вам всегда называют отношения соответствующим образом:

// belongsTo, hasOne singular like: 
public function pet() 
{ 
    return $this->belongsTo('Pet'); 
} 

// hasMany, belongsToMany, hasManyThrough plural: 
public function photos() 
{ 
    return $this->hasMany('Photo'); 
} 

Тогда это obvoius что вы не можете это сделать:

$pet->photos->imageName; 

для вас позвоните $pet->photos который является коллекцией.

Итак, чтобы сделать его работу нужно перебрать коллекцию:

// assuming it's a blade template and relation's name is plural like I suggested 
@foreach ($pet->photos as $photo) 
    <h1>{{ $photo->imageName }}</h1> 
@endforeach 

..or:

$pet->photos->first()->imageName; 
+0

Спасибо! Код, имитирующий жизнь;) Я попытался добавить первый() ($ pet-> photo-> first() -> imageName), но он выбрасывает ошибку «Пытаться получить свойство не-объекта» –

+0

'first()' wasn ' виновным. Вероятно, у вас была пустая коллекция, поэтому она вернула «null», а затем образное имя действительно было вызвано не-объектом. –

+0

Как я могу рассчитать пустую коллекцию? –

0

Ваша попытка доступа к собственности с вашим подходом - я считаю, что это метод.

Чтобы получить доступ к свойствам соответствующей модели нужно использовать этот метод:

`$pet->photo()->imageName` 

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

Это также работает, если вы хотите, чтобы получить коллекцию родственных моделей $pet->photo()->get()

Это немного Gotcha и один я регулярно должен получить мою голову вокруг.

Ta

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