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 - Eloquent - 获得没有外键的关系
Eloquent - 如果外键有行,则防止删除数据 - Laravel