我有一个产品表和一个product_pictures表,其中一个产品可以有许多图片(一对多关系)。我正在尝试显示所有产品及其所有详细信息(例如名称,数量等),并且仅显示其产品图片之一。这是我到目前为止尝试过的。
$products = Product::->join('product_pictures', 'products.product_id', '=', 'product_pictures.product_id')
->select('product_name', 'quantity', 'products.product_id', 'product_picture_id')
->groupBy('products.product_id')
->get();
我也尝试过使用distinct
来不走运。有什么建议吗?
答案 0 :(得分:1)
您可以使用with
功能。它将包括模型的关系。因此,如果您有Product
模型,则可以查询Product
的关系,例如Product
-> ProductPicture
。
确保在模型中建立了关系。大概是这样的:
Product
模型:
public function pictures()
{
return $this->hasMany('App\ProductPicture', 'product_id', 'id');
}
ProductPicture
模型:
public function product()
{
return $this->belongsTo('App\Product', 'id', 'product_id');
}
带有with
函数的查询将如下所示:
$products = Product::with(['pictures' => function($q) {
$q->take(1);
])->get();
它将获得所有产品,并在该产品上附加一张图片(其关系ip)。
更新:
事实证明,它将仅从一个产品获得1张图片,而将其他产品的图片留空。因此,嵌套在take
中的with
函数仅在使用find
获取单个父对象时才能按预期工作。
您可以尝试在Product
模型中定义一个新功能,如下所示,它只会在产品上附加一张图片:
public function singlePicture()
{
return $this->hasMany('App\ProductPicture', 'product_id', 'id')->limit(1);
}
在查询中调用它:
$products = Product::with(['singlePicture'])->get();