首页 > 解决方案 > 在 laravel 中按相关表排序查询

问题描述

我想根据某些因素以 laravel 方式订购查询。其中之一是相关表。

所以现在我的查询是这样的:

$products = Product::where("price", "<=", $maxBudget)   

我知道我可以像这样在 where 子句中添加一个函数

->where(function ($q) use($mature) {
    if ($mature == "1") {
        $q->where('mature', 1)->orWhere('mature', 0);   
    } else {
        $q->where('mature', 0);
    } 
})  

但是我也想为我的订单创建一个函数。像这样的东西(我知道这是错误的,这只是一个例子):

->orderBy(function ($q) use($orderBy) {
    if ($orderBy == "price_low") {
        $q->orderBy('price', 'desc');
    } elseif ($orderBy == "price_high") {
        $q->orderBy('price', 'asc');                    
    } elseif ($orderBy == "rating") {
        $q->orderBy( $product->user->getAvgStarRating(), 'desc')
    } else {
        $q->orderBy('created_at', 'desc');
    }
})      

$q->orderBy( $product->user->getAvgStarRating(), 'desc')显然是错误的, $product 甚至没有定义,但你明白了。在这种情况下,我想根据产品创建者的平均评分来订购我的查询。

所以我的问题是:我如何做到这一点,以便我可以在我的订购中添加某种功能,以及如何订购基于相关表的查询?

标签: phpsqllaravel

解决方案


定义user关系(如果还没有):

public function user() {
    return $this->belongsTo(User::class);
}

然后你可以使用修改后的withCount()

Product::withCount(['user' => function($query) {
     $query->select('avgStarRating');
}])->orderBy('user_count', 'desc');

您还可以使用简单的 JOIN:

Product::select('products.*')
    ->join('users', 'users.id', 'products.user_id')
    ->orderBy('users.avgStarRating', 'desc');

推荐阅读