【问题标题】:Laravel Eloquent seeder calculate number of row for each foreign keyLaravel Eloquent 播种机计算每个外键的行数
【发布时间】:2022-01-18 08:26:04
【问题描述】:

我想计算每个站点的服务数量,并使用 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();
        }
    }
}

【问题讨论】:

    标签: eloquent laravel-8


    【解决方案1】:

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

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

    【讨论】:

    • 你能分享更多关于实现这个的细节吗?谢谢!
    • 你想知道,每个站点有多少服务?因此,在您的数据库中每个站点的播种器中,编写上面的代码。试试这个,看看结果。
    • 你的意思是我必须为每个站点编写单独的播种器吗?因为当只有几百个站点时,这没有任何意义。你能通过显示一些代码来进一步解释吗?谢谢
    • 不不,你有一个Site 模型,你可以访问你想要的每个站点。像这样:``` $sites = Site::all(); ```
    • $sites = Site::all(); foreach($sites as $site){ $result[$site->id] = $site->services()->count(); }
    【解决方案2】:

    我设法做到了:

    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]

    运行播种机

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2022-11-27
      • 2018-04-22
      • 2020-05-31
      相关资源
      最近更新 更多