雄辩地获得所有用户,但先从相关表订购

时间:2019-09-18 13:30:35

标签: php laravel eloquent

我正在建立我的第一个Laravel项目,我试图吸引所有用户,并根据他们拥有的产品数量对其进行排序。这是我的代码:

我有User.php

public function products()
{
    return $this->hasMany(Product::class, 'user_id');
}

Product.php

public function user()
{
    return $this->belongsTo(User::class, 'user_id', 'id');
}

UsersController.php

    public function index()
    {

        $user = User::select(DB::raw('users.*, count(*) as `products`'))
            ->join('products', 'users.id', '=', 'products.user_id')
            ->groupBy('user_id')
            ->orderBy('products', 'desc')
            ->get();

        return response($user, 200);

    }

这将返回此JSON:

{
    id: 5,
    role: 1,
    state: 1,
    name: "Frida Greenfelder",
    email: "cummings.alfreda@example.org",
    email_verified_at: "2019-09-11 13:23:20",
    date_of_birth: "1981-01-28",
    created_at: "2019-09-11 13:23:20",
    updated_at: "2019-09-11 13:23:20",
    products: 8
},

这有效,但是,这只会返回拥有产品的用户并对他们进行排序。我想做的是吸引所有用户,然后首先按他们拥有的产品数量对其进行排序。有些用户没有产品,这意味着他们的用户ID不在产品表中。对于没有产品的用户,它应该只向用户返回产品:0。

我将如何去做? 我在网上搜索该确切的问题/解决方案时遇到了一些麻烦,因此也遇到了这个问题。

1 个答案:

答案 0 :(得分:0)

您可以使用Eloquent:

public function index()
{ 

    $user = User::with('products')->withCount('products')->orderBy('products_count', 'desc')->get();

   return response($user, 200);
}