我想根据某些因素以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,但是您知道了。在这种情况下,我想根据产品创建者的平均评分来排序查询。
所以我的问题是:如何做到这一点,以便可以在排序中添加某种功能,以及如何基于相关表对查询进行排序?
答案 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();