2013-04-11 2 views
3

Я пытаюсь получить повесить Laravel. Я использую Laravel 4. Прямо сейчас у меня есть две таблицы, таблица «Продукты» и таблица «Изображения». У продукта может быть много изображений, и изображение принадлежит продукту.Laravel Eloquent выбрать из отношений

Поэтому у меня есть две модели:

class Product extends Eloquent { 

    public function images() 
    { 
     return $this->hasMany('Image'); 
    } 

} 

class Image extends Eloquent { 

    protected $table = 'product_images'; 

    public function product() 
    { 
     return $this->belongsTo('Product'); 
    } 

} 

Теперь я строительстве «индекс» страницы ресурса, так что я продукт :: все() в контроллере и отправить на представление.

В представлении я делаю foreach и петлю над всеми продуктами. Но теперь я хочу получить изображение для показа с продуктом. Но я не могу понять, как получить, например, первый образ.

Когда я делаю $product->images Я получаю объект всех изображений, связанных с продуктом.

Когда я $product->images->url я получаю сообщение об ошибке (Undefined свойство «URL»)

Я попытался $product->images->first()->url это также дает ошибку (Попытка получить свойство не-объекта)

Что я делать не так?

ответ

1

Свойство images - свойство, подобное массиву, которое вы можете пропустить.

foreach ($product->images as $image) { 
    echo $image->url; 
} 

В качестве альтернативы, если вы хотите только первого, вы можете получить доступ к индексу.

$product->images[0]->url; 
+0

Когда я это делаю: '$ product-> images [0] -> url', я получаю' Undefined offset: 0'. Когда я использую foreach, он работает. Было бы неплохо использовать цикл каждый раз, когда я просто хочу получить одно изображение. – RGweb

+0

Тогда подход Марко должен работать. Извините, я не смог проверить мой, поскольку я не на своей машине разработки. – Dwight

+0

Ну, я думаю, что что-то не так с моей начальной настройкой. Я начал новый проект, и теперь '$ product-> images [0] -> url' действительно работает! – RGweb

0

Вы можете использовать следующую функцию PHP.

$first_image = array_shift($product->images); 

Тогда $ first_image будет один объект изображения, и получить доступ к URL изображения должен быть легким: $ first_image-> ULR

Примечание: Не проверял, но должно работать. Дайте нам знать.

3

Вы пробовали зарядить?

foreach (Product::with('images')->get() as $product) 
{ 
    echo $product->images->first()->url; 
} 
+0

Я пытался что-то подобное, и это помогло. У меня есть модель User с ролью() принадлежит To ('Role'); и модель ролей с пользователями() hasMany («Пользователь»). Я хотел получить роль пользователя. Это сделало это: dd (Пользователь :: с ('role') -> find (2)); Но, с должен быть первым. – Jazzy

+0

Спасибо, он отлично вписывается в то, что я искал! https://laravel.com/docs/5.5/eloquent-relationships#eager-loading –

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

  • Нет связанных вопросов^_^