Laravel Eloquent seeder 计算每个外键的行数

Laravel Eloquent seeder calculate number of row for each foreign key

我想计算每个站点的服务数量,并使用 Seeder 将计数插入站点记录的每一行。系统已经有生产数据,所以我不能将 0 作为所有站点的默认值。

这是我的模型声明:

class Site extends Model
{
    use HasFactory;
    public $fillable = ['name', 'state', 'district', 'zone', 'coordinates'];

    public function states()
    {
        return $this->belongsTo(State::class, 'state');
    }

    public function cities()
    {
        return $this->belongsTo(City::class, 'district');
    }

    public function services()
    {
        return $this->hasMany('\App\Models\Service');
    }
}

class Service extends Model
{
    use HasFactory;
    protected $dates = ['date'];
    public $fillable = ['user_id', 'site_id', 'title', 'status', 'remarks', 'report', 'date'];

    public function user()
    {
        return $this->belongsTo('\App\Models\User');
    }

    public function site()
    {
        return $this->belongsTo('\App\Models\Site');
    }

    public function serviceItems() {
        return $this->hasMany('\App\Models\ServiceItem');
    }

}

更新:

class ServiceCounterSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $sites = Site::all();
        foreach($sites as $site){
            $site->service_counter = $site->services->count();
            $site->save();
        }
    }
}

您可以创建播种机,并将其用于每个 site 对象:

$site->services()->count();

我成功地使用了:

class ServiceCounterSeeder extends Seeder
{
    public function run()
    {
        $sites = Site::all();
        foreach($sites as $site){
            $site->service_counter = $site->services->where('status', ServiceStatus::DONE)->count(); // you can add custom filter WHERE here
            $site->save();
        }
    }
}

受@vahid 的回答启发。 不要忘记使用 php artisan db:seed --class=[SeederName]

运行 播种机