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 Eager Loading 关系的选择