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]
运行 播种机
我想计算每个站点的服务数量,并使用 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]
运行 播种机