【发布时间】:2020-12-15 17:16:10
【问题描述】:
我的产品也有 cmets。这个 cmets 可以被投票,并且 cmets 也可以有子 cmets。
现在我想按日期、喜欢的数量和子 cmets 的数量对这些 cmets 进行排序。
在向您展示我的尝试之前,我将向您展示我的代码:
Product.php(型号)
namespace App;
class Product extends Model
{
/**
* @Protected_variables
*/
protected $with = ['comments', 'user'];
/**
* @Relationships
*/
public function user()
{
return $this->belongsTo('App\User');
}
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
}
如你所见,我已经用变量 $with 告诉 Laravel 在加载产品时始终加载 comments 和 user。
ProductController.php
public function show(Product $product, Request $request)
{
if($request->has('sorting') && in_array($request->sorting, ['Beliebtesten', 'Diskutiertesten', 'Neusten'])){
if($request->sorting == 'Neusten'){
$product->load(['comments' => function ($query) {
$query->orderBy('created_at', 'desc');
}]);
}else if($request->sorting == 'Diskutiertesten'){
$product->load(['comments.children' => function ($query) {
$query->orderBy('published_date', 'asc');
}]);
}else{
$product->load('comments')->get()->sortByDesc(function($product)
{
return $product->likes->count();
});
}
return response()->json([
'product' => $product
]);
}else{
$product->load('comments');
return response()->json([
'product' => $product
]);
}
}
所以,我现在有两个问题:
-
我还需要
$product->load('comments')吗? - 因为我已经弄清楚当我只是通过$product而不执行$product->load('comments')我还加载了cmets...看起来我不需要它。对吗? -
如何按喜欢的数量(行,因为您只能投票)和子 cmets 的数量(行)对 cmets 进行排序?
这是我迄今为止尝试过的(都不适合我):
1.
$product->load('comments')
->withCount('likes')
->orderBy('likes_count','DESC')
->get();
$product->loadCount('comments');
$product->orderBy('comments_count', 'desc');
【问题讨论】:
-
我在 Product 模型中看不到
likes关系,但例如在return $product->likes->count();中使用它。我错过了什么吗? -
你看不到它,因为我没有发布
comments模型。comments模型也有一个$with属性,其中当然有likes和children! -
我明白,但是使用像
$product->likes这样的语法是行不通的,因为likes不是产品的属性。属于评论模型。
标签: php mysql laravel sorting eloquent