laravel中相关表的订单查询

时间:2018-06-20 02:20:04

标签: php sql 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,但是您知道了。在这种情况下,我想根据产品创建者的平均评分来排序查询。

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

2 个答案:

答案 0 :(得分:1)

定义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');

答案 1 :(得分:1)

您可以尝试一下

$products = Product::where("price", "<=", $maxBudget)   
                    ->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->join('users', 'users.id', '=','products.user_id')->orderBy('users.avgStarRating', 'desc')
                        } else {
                            $q->orderBy('created_at', 'desc');
                        }
                    })->get();