リレーション先に制約を設けた状態で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データが追加されています。