Laravel Eloquent 从关系中选择

Posted

技术标签:

【中文标题】Laravel Eloquent 从关系中选择【英文标题】:Laravel Eloquent select from relationship 【发布时间】:2013-04-03 06:13:22 【问题描述】:

我一直在尝试掌握 Laravel 的窍门。我正在使用 Laravel 4。 现在我有两个表,一个“产品”表和一个“图像”表。 一个产品可以有很多张图片,一张图片属于一个产品。

所以我有两个模型:

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 这也会报错(试图获取非对象的属性)

我做错了什么?

【问题讨论】:

【参考方案1】:

您尝试过急切加载吗?

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 必须是第一位的。 谢谢,它完全符合我的要求! laravel.com/docs/5.5/eloquent-relationships#eager-loading【参考方案2】:

images 属性是一个类似数组的属性,您可以循环访问。

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

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

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

【讨论】:

当我这样做时:$product->images[0]->url,我得到Undefined offset: 0。当我使用 foreach 时,它确实有效。每次我只想获取一张图像时都必须使用循环并不是很好。 那么 Marko 的方法应该奏效了。抱歉,由于我不在我的开发机器上,所以无法测试我的。 嗯,我认为我的初始设置有问题。我开始了一个全新的项目,现在$product->images[0]->url 似乎可以工作了!【参考方案3】:

您可以尝试使用以下 php 函数。

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

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

注意:尚未对其进行测试,但应该可以使用。让我们知道。

【讨论】:

以上是关于Laravel Eloquent 从关系中选择的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 在与其他表连接后从关系中选择字段

Laravel Eloquent,仅选择存在关系的行

Laravel:Eloquent Eager Loading 关系的选择

通过findMany选择列并在Laravel的Eloquent中保持关系

无法从 Laravel Eloquent 关系中获取数据

Laravel Eloquent - 从关系中检索数据