【问题标题】:Laravel eager loading sort by count of relationship entries/valuesLaravel 急切加载按关系条目/值的计数排序
【发布时间】: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 在加载产品时始终加载 commentsuser

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
        ]);
    }
}

所以,我现在有两个问题:

  1. 我还需要$product->load('comments') 吗? - 因为我已经弄清楚当我只是通过$product 而不执行$product->load('comments') 我还加载了cmets...看起来我不需要它。对吗?

  2. 如何按喜欢的数量(行,因为您只能投票)和子 cmets 的数量(行)对 cme​​ts 进行排序?

这是我迄今为止尝试过的(都不适合我):

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 属性,其中当然有 likeschildren
  • 我明白,但是使用像 $product->likes 这样的语法是行不通的,因为 likes 不是产品的属性。属于评论模型。

标签: php mysql laravel sorting eloquent


【解决方案1】:

1:

$comments = $product->comments;
$comments->loadCount('likes');
$comments->sortByDesc('likes_count');

2:

$product->loadCount('comments');
$product->sortByDesc('comments_count');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2017-03-01
    • 2017-01-25
    • 1970-01-01
    • 2021-12-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多