laravel 雄辩,只检查单对多关系中的第一项

Posted

技术标签:

【中文标题】laravel 雄辩,只检查单对多关系中的第一项【英文标题】:laravel eloquent, check only first item in onetomany relationship 【发布时间】:2022-01-07 21:56:38 【问题描述】:

我有 2 个模型:

有多种价格的产品型号:

public function prices()

    return $this->hasMany(Price::class)->orderBy('price', 'DESC');

属于产品的价格模型:

public function product()

    return $this->belongsTo(Product::class);

还有一些其他的关系。我有一个这样的查询:

    $query = Product::query();
    $query->where('brandId', $brand->id);
    $query->where('termId', $termId);
    $query->when($productType, function ($q) use ($productType)
        $q->with('productAttributes')->whereHas('productAttributes', function($query) use ($productType)
            $query->where(['attributeId'=> 5, 'attributeDataId'=>$productType]);
        );
    );

我也想查询商品价格。

主要问题是我只想检查第一个价格以查看它是否小于给定数字。

此查询检查所有价格(这不是我想要的):

    $query->when($maxPrice, function ($q) use ($maxPrice)
        $q->with('prices')->whereHas('prices', function($query) use ($maxPrice)
            $query->where('price', '<=', $maxPrice);
        );
    );

【问题讨论】:

与产品的第一个价格一样?这会使用id/created_at 日期来确定哪个是“第一”吗?另外,你使用的是什么版本的 Laravel? 是的,产品的第一个价格。我正在使用 Laravel 7。我已经按 price 列(相关)对价格进行了排序。 【参考方案1】:

您可以为此使用subquery where clause:

->where(function ($query) 
    $query->select('price')
        ->from('prices')
        ->whereColumn('products.id', 'prices.product_id')
        ->orderByDesc('price')
        ->limit(1);
, '<=', $maxPrice)

您的查询将类似于:

$query = Product::query()
    ->where('brandId', $brand->id)
    ->where('termId', $termId)
    ->when($productType, function ($q) use ($productType) 
        $q->with('productAttributes')
            ->whereHas('productAttributes', function ($query) use ($productType) 
                $query->where(['attributeId' => 5, 'attributeDataId' => $productType]);
            );
    )
    ->when($maxPrice, function ($q) use ($maxPrice) 
        $q->with('prices')->where(function ($query) 
            $query->select('price')
                ->from('prices')
                ->whereColumn('products.id', 'prices.product_id')
                ->orderByDesc('price')
                ->limit(1);
        , '<=', $maxPrice);
    );

【讨论】:

以上是关于laravel 雄辩,只检查单对多关系中的第一项的主要内容,如果未能解决你的问题,请参考以下文章

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系

Laravel 5 雄辩的多对多关系问题

Laravel - 雄辩的关系 - 多对多 - 获取中间表列

Laravel 和雄辩的返回结果来自多对多关系

两个多对多相关表之间的Laravel雄辩关系

Laravel 8 多对多更改自定义属性的 id