2013-04-11 173 views
3

我一直在試圖獲得Laravel的掛鉤。我正在使用Laravel 4. 現在我有兩張桌子,一張'產品'桌子和一張'圖片'桌子。 產品可以有許多圖像,圖像屬於產品。Laravel雄辯從關係中選擇

所以,我有兩個型號:

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我得到一個錯誤(未定義的屬性「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 2013-04-11 07:05:44

+0

然後馬可的方法應該工作。對不起,我不能測試我的,因爲我不在我的開發機器上。 – Dwight 2013-04-11 08:18:09

+0

嗯,我認爲我的初始設置有問題。我開始了一個全新的項目,現在'$ product-> images [0] - > url'確實可以工作! – RGweb 2013-04-11 10:26:01

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

我正在嘗試類似的東西,這有所幫助。我有一個角色()belongsTo('角色')的用戶模型;以及具有users()hasMany('User')的角色模型。我想讓用戶擔任角色。這樣做: dd(User :: with('role') - > find(2)); 但是,必須先來。 – Jazzy 2013-06-26 18:49:41

+0

謝謝,它完全符合我的要求! https://laravel.com/docs/5.5/eloquent-relationships#eager-loading – 2017-09-24 10:50:45