使用 Eloquent withCount () 來 count 對應關係的條數

文章轉發自專業的Laravel開發者社區,原始連接: https://learnku.com/laravel/t...

Eloquent 有一個不爲人知的函數叫 withCount():它能夠幫助獲取包括遠程一對多關係在內的對象關聯的記錄條數。接下來看示例。php

在咱們的示例小項目中,咱們有三個模型:UserPost 以及 Comment。全部的關聯關係均可以用這三個模型來舉例描述,先看 app/User.php 模型:laravel

public function posts()
{
    return $this->hasMany(Post::class);
}

public function comments()
{
    return $this->hasManyThrough(Comment::class, Post::class);
}

如今,咱們來嘗試在頁面上顯示以下的表格 - 用戶及他們的文章和評論的統計列表:app

實現很簡單,下面是控制器 UserController 的代碼:函數

public function index()
{
    $users = User::withCount(['posts', 'comments'])->get();
    return view('users', compact('users'));
}

傳遞到 withCount() 方法的每個參數,最終都會在模型實例中建立一個參數名添加了 _count  後綴的屬性。所以,在上面的例子中,能夠經過訪問 $user->posts_count** 和 **$user->comments_count 屬性來獲取統計數值。post

而後,在咱們的視圖文件中,咱們有:this

<table class="table">
    <thead>
        <tr>
            <th>User</th>
            <th class="text-center">Posts</th>
            <th class="text-center">Comments</th>
        </tr>
    </thead>
    <tbody>
        @foreach ($users as $user)
            <tr>
                <td>{{ $user->name }}</td>
                <td class="text-center">{{ $user->posts_count }}</td>
                <td class="text-center">{{ $user->comments_count }}</td>
            </tr>
        @endforeach
    </tbody>
</table>

注意, withCount() 既能夠處理 hasMany() 關係,也能夠處理hasManyThrough().的第二級深度。spa

不只如此,咱們甚至能夠在使用 withCount() 時指定關聯模型的過濾條件。假設,咱們有一個評論表(comments),包含一個審覈狀態(approved)的字段。下面的示例展現瞭如何對該字段進行過濾,甚至能夠指定一個別名:3d

$users = User::withCount([
    'posts', 
    'comments', 
    'comments as approved_comments_count' => function ($query) {
        $query->where('approved', 1);
    }])
    ->get();

如此,即可在試圖中使用 $user->approved_comments_count 來展現統計數據。code

若想了解更多關於 withCount() 方法的信息 – 可查看 Laravel 官方文檔對象

相關文章
相關標籤/搜索