只查询一对多关系中的一行

时间:2020-06-29 11:50:00

标签: php mysql laravel eloquent laravel-query-builder

我有一个产品表和一个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来不走运。有什么建议吗?

1 个答案:

答案 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();
相关问题