Laravel Eloquent 从关联表中选择数据

4

我一直在尝试掌握Laravel技术。我正在使用Laravel 4版本。 现在我有两个表,一个是“产品(Products)”表,另一个是“图片(Images)”表。 一个产品可以拥有多张图片,而一张图片属于一个产品。

因此,我有两个模型:

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');
    }

}

现在我正在构建一个资源的“索引”页面,所以我在控制器中执行Product::all()并将其发送到视图。

在视图中,我使用foreach循环遍历所有产品。但现在我想获得一个与产品一起显示的图像。但是我似乎无法弄清如何获取例如第一个图像。

当我执行$product->images时,我获得了与产品相关的所有图像的对象。

当我执行$product->images->url时,我会收到一个错误(未定义属性'url')

我尝试过$product->images->first()->url,但这也会产生一个错误(试图获取非对象的属性)

我做错了什么?

3个回答

3

你尝试过贪婪加载吗?

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

我之前也在尝试类似的东西,这个帮了我很多。我有一个用户模型,其中包含 role() belongsTo('Role'),还有一个角色模型,其中包含 users() hasMany('User')。我想获取具有特定角色的用户。这个做到了:dd(User::with('role')->find(2));但是,必须先使用 with。 - Jazzy
谢谢,它完全符合我所寻找的! https://laravel.com/docs/5.5/eloquent-relationships#eager-loading - Paul Laffitte

1

images属性是类似数组的属性,您可以通过循环遍历它。

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

或者,如果你只想要第一个,你可以访问索引。

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

当我执行 $product->images[0]->url 时,会出现 Undefined offset: 0 的错误。但是如果使用 foreach 循环,则可以正常工作。每次只想获取一张图片时都需要使用循环,这样不是很麻烦吗? - RGweb
那么Marko的方法应该可以奏效。抱歉我无法测试我的方法,因为我不在我的开发机器上。 - Dwight
嗯,我认为我的初始设置有问题。我开始了一个全新的项目,现在$product->images[0]->url似乎可以工作了! - RGweb

0
您可以尝试使用以下的PHP函数。
$first_image = array_shift($product->images);

那么,$first_image 将是一个图像对象,访问图像的 URL 应该很容易:$first_image->ulr

注意:尚未测试,但应该可以工作。让我们知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接