php - 在 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 甚至没有定义,但你明白了。在这种情况下,我想根据产品创建者的平均评分来订购我的查询。
所以我的问题是:我如何做到这一点,以便我可以在我的订购中添加某种功能,以及如何订购基于相关表的查询?
解决方案
定义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');
推荐阅读
- c# - Linq 列名作为变量
- c - 如何使用 C 读取主文件表 (MFT)?
- vue.js - 如何传递多个突变来更新 Vuex 存储?
- python - 如何在迁移步骤中修复 OnetoOneField 中的唯一约束
- reactjs - Material UI 的工具提示 - 自定义样式
- javascript - 在javascript中查找重复值及其重复次数
- flutter - 用颤动动画显示或隐藏小部件
- android - 错误:在项目“应用程序”中,已解决的 Google Play 服务库依赖项依赖于另一个确切版本的依赖项
- amazon-web-services - 使用请求路径从 AWS API Gateway 返回 302
- javascript - 如何将嵌套的对象数组转换为 Reactjs 中的字符串数组?