Laravel Eloquent 播种机计算每个外键的行数

Posted

技术标签:

【中文标题】Laravel Eloquent 播种机计算每个外键的行数【英文标题】:Laravel Eloquent seeder calculate number of row for each foreign key 【发布时间】: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();
        
    

【问题讨论】:

【参考方案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]

运行播种机

【讨论】:

以上是关于Laravel Eloquent 播种机计算每个外键的行数的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 中播种时的质量分配错误

Laravel:当表有两个外键时,为具有关系的数据库表播种

Laravel - Eloquent - 获得没有外键的关系

Eloquent - 如果外键有行,则防止删除数据 - Laravel

如何从 laravel 的 eloquent 集合中获取外键

为啥 Laravel PHPUnit 内存测试会播种我的主数据库?