2013-04-11 175 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