リレーション先に制約を設けた状態でCount / Laravel withCountにクエリ制約

リレーション先に制約を設けた状態でCountする方法を解説していきます。

withCountを使っていきますが、withによるリレーション先のデータに制約を設けたデータをcountしていきます。

School Modelを準備します。 Student ModelとhasManyでリレーションしていることとします。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class School extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
    ];

    public function student()
    {
        return $this->hasMany(Studnet::class, 'id', 'school_id');
    }

}

任意のControllerにて、制約を設けたwithCountをします。
リレーション先( student )の sexカラム = woman であるデータを限定して、countしてくれます。

$school_with_student_count = 
School::withCount(['student' => function ($query) {
    $query->where('sex', 'woman');
}])
->get();

これで、School modelに
student_count というカラム、countデータが追加されています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です