厂房returnscompany_id和package_id一样
factory building returns company_id and package_id the same
在我的代码中每个公司都属于一个包并且有一个包用法
class 包扩展模型。
包装型号:
protected $fillable =[
'name',
'daily_cv_view',
'monthly_cv_view',
'per_job_post_cv_view',
'active_job_post_limit',
'question_per_job_post_limit',
'package_lifetime',
'job_post_lifetime_limit',
'price'
];
public function companies()
{
return $this->hasMany('App\Models\Company');
}
public function packageUsages()
{
return $this->hasMany('App\Models\package_usage');
}
公司模式
public function package()
{
return $this->belongsTo('App\Models\Package', 'package_id');
}
包使用模型
public function company()
{
return $this->belongsTo('App\Models\Company');
}
public function package()
{
return $this->belongsTo('App\Models\Package');
}
在我的数据库播种器中,我正在尝试为每个创建的公司构建一个包 sage。所以它看起来像这样:
$companies=factory(App\Models\Company::class, 20)->create()->each(function ($company) {
$company->users()->save(factory(App\Models\User::class)->make());
$company->events()->save(factory(\App\Models\Event::class)->make());
});
foreach ($companies as $company)
$company->packageUsages()->save(factory(\App\Models\PackageUsage::class)->make([
'company_id'=>$company->id,
'package_id'=>$company->first()->package_id
]));
最后我的 pacage 用法 fctory 是这样的:
$factory->define(App\Models\PackageUsage::class, function (Faker $faker) {
$companyId= $faker->randomElement(\App\Models\Company::all()->pluck('id')->toArray());
$company= App\Models\Company::find($companyId);
$package=$company->package;
$dailyCvView=$package->first()->daily_cv_view;
return [
'company_id'=>$company,
'package_id'=>$package,
'daily_cv_view'=>$faker->numberBetween($min=0 , $max=$dailyCvView ),
'monthly_cv_view'=>$faker->numberBetween($min=$dailyCvView , $max=$package->monthly_cv_view ),
'active_job_post_count'=>$company->jobPosts->count(),
'expiration_date'=>$faker->dateTimeBetween($min='now', $max='+ 30 days')
];
});
公司工厂:
$factory->define(\App\Models\Company::class, function (Faker $faker) {
return [
'name'=>$faker->company,
'company_size'=>$faker->randomElement(['10','50','100','200']),
'slogan'=>'باما کار کنید',
'website'=>$faker->domainName,
'logo'=>'/images/companies/avatar',
'message_title'=>'ما در اینجا.....',
'message_content'=>$faker->paragraph('10'),
'main_photo'=>'/images/companies/mainphotos/avatar',
'about_us'=>$faker->paragraph('10'),
'why_us'=>$faker->paragraph('10'),
'recruiting_steps'=>$faker->paragraph('10'),
'address'=>$faker->address,
'email'=>$faker->safeEmail,
'phone_number'=>$faker->numberBetween(10,100),
'location'=>$faker->city,
'package_id'=>$faker->randomElement(\App\Models\Package::all()->pluck('id')->toArray())
];
});
当我 运行 这个它 returns 错误:
Illuminate\Database\QueryException : SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`balatar`.`package_usages`, CONSTRAINT `package_usages_package_id_foreign` FOREIGN KEY (`package_id`
) REFERENCES `packages` (`id`)) (SQL: insert into `package_usages` (`company_id`, `package_id`, `daily_cv_view`, `monthly_cv_view`, `active_job_post_count`, `expiration_date`, `updated_at`, `created_at`) values (4, 4, 12, 484, 0, 2018-09-16 07:26:11, 2018-08-30
03:45:22, 2018-08-30 03:45:22))
当我检查数据库时,我发现它为每个公司 ID 创建了 3 个包,并且包 ID 相同。因为我认为第四个当它试图用两个 ids 4 构建它并且我只插入 3 个包时外键失败。
我的代码有什么问题?
我认为您的第一个错误是数据库设计。您的公司将有不止一个包裹,据我所知,当时只有一个活动包裹。因此它需要在您的 companies
和 packages
table 之间创建多对多关系,如下所示:
Schema::create('rel_company_package', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->unsignedInteger('package_id');
$table->unsignedInteger('company_id');
$table->timestamp('activated_at')->nullable();
$table->timestamp('expires_at')->nullable();
$table->boolean('is_active')->nullable();
$table->unsignedInteger('nubmer_of_remaining_job_posts');
});
- actived_at:贵公司激活套餐的日期。
- nubmer_of_remaining_job_posts:首先来自您的包裹数据,您的公司发布职位后将减少一个。
- expires_at:当您的包裹过期时
- is_active:这个字段是多余的,但会帮助你花费更多的内存而不是计算资源。将确定当前分配的包是否处于活动状态
Note: you should fill in activated_at
, expires_at
and is_active
with proper values as soon as decide to activate the package.
Also you should fill in nubmer_of_remaining_job_posts
at package assignment time.
您决定播种的是您可能不依赖于生产时间的日志数据,因为它很容易变得庞大并且需要大量资源来计算您想要的内容。顺便说一句,日志数据 (PackageUsage
) 应该只保留你的枢轴 table 的 (rel_company_package
) id
.
让我们直接回到你的错误:
首先在你的 company factory
中加载所有包并随机选择一个(你的 package usage factory
是),你最好不要这样做而是让 MySQL 选择一个随机给你一个
随机公司:
$company = $\App\Models\Company::query()->inRandomOrder->first();
// and use $company->id
随机包装:
$package = \App\Models\Package::query()->inRandomOrder()->frist();
// and use $package->id
另一点是,您应该创建一个 PackageUsage
实例,如下所示:
$company->packageUsages()->save(factory(\App\Models\PackageUsage::class)->make([
'package_id' => $company->first()->package_id
]));
不需要再次通过company_id
。似乎您错过了 Company
模型中的 packageUsages()
方法,它应该是:
public function packagesUsage()
{
return $this->hasMany('\App\Models\PackageUsage', 'company_id')
}
这可能是您将 comapny_id
替换为 package_id
的打字错误所致。
但是正如我一开始提到的,你最好先修复你的结构。
在我的代码中每个公司都属于一个包并且有一个包用法 class 包扩展模型。 包装型号:
protected $fillable =[
'name',
'daily_cv_view',
'monthly_cv_view',
'per_job_post_cv_view',
'active_job_post_limit',
'question_per_job_post_limit',
'package_lifetime',
'job_post_lifetime_limit',
'price'
];
public function companies()
{
return $this->hasMany('App\Models\Company');
}
public function packageUsages()
{
return $this->hasMany('App\Models\package_usage');
}
公司模式
public function package()
{
return $this->belongsTo('App\Models\Package', 'package_id');
}
包使用模型
public function company()
{
return $this->belongsTo('App\Models\Company');
}
public function package()
{
return $this->belongsTo('App\Models\Package');
}
在我的数据库播种器中,我正在尝试为每个创建的公司构建一个包 sage。所以它看起来像这样:
$companies=factory(App\Models\Company::class, 20)->create()->each(function ($company) {
$company->users()->save(factory(App\Models\User::class)->make());
$company->events()->save(factory(\App\Models\Event::class)->make());
});
foreach ($companies as $company)
$company->packageUsages()->save(factory(\App\Models\PackageUsage::class)->make([
'company_id'=>$company->id,
'package_id'=>$company->first()->package_id
]));
最后我的 pacage 用法 fctory 是这样的:
$factory->define(App\Models\PackageUsage::class, function (Faker $faker) {
$companyId= $faker->randomElement(\App\Models\Company::all()->pluck('id')->toArray());
$company= App\Models\Company::find($companyId);
$package=$company->package;
$dailyCvView=$package->first()->daily_cv_view;
return [
'company_id'=>$company,
'package_id'=>$package,
'daily_cv_view'=>$faker->numberBetween($min=0 , $max=$dailyCvView ),
'monthly_cv_view'=>$faker->numberBetween($min=$dailyCvView , $max=$package->monthly_cv_view ),
'active_job_post_count'=>$company->jobPosts->count(),
'expiration_date'=>$faker->dateTimeBetween($min='now', $max='+ 30 days')
];
});
公司工厂:
$factory->define(\App\Models\Company::class, function (Faker $faker) {
return [
'name'=>$faker->company,
'company_size'=>$faker->randomElement(['10','50','100','200']),
'slogan'=>'باما کار کنید',
'website'=>$faker->domainName,
'logo'=>'/images/companies/avatar',
'message_title'=>'ما در اینجا.....',
'message_content'=>$faker->paragraph('10'),
'main_photo'=>'/images/companies/mainphotos/avatar',
'about_us'=>$faker->paragraph('10'),
'why_us'=>$faker->paragraph('10'),
'recruiting_steps'=>$faker->paragraph('10'),
'address'=>$faker->address,
'email'=>$faker->safeEmail,
'phone_number'=>$faker->numberBetween(10,100),
'location'=>$faker->city,
'package_id'=>$faker->randomElement(\App\Models\Package::all()->pluck('id')->toArray())
];
});
当我 运行 这个它 returns 错误:
Illuminate\Database\QueryException : SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`balatar`.`package_usages`, CONSTRAINT `package_usages_package_id_foreign` FOREIGN KEY (`package_id`
) REFERENCES `packages` (`id`)) (SQL: insert into `package_usages` (`company_id`, `package_id`, `daily_cv_view`, `monthly_cv_view`, `active_job_post_count`, `expiration_date`, `updated_at`, `created_at`) values (4, 4, 12, 484, 0, 2018-09-16 07:26:11, 2018-08-30
03:45:22, 2018-08-30 03:45:22))
当我检查数据库时,我发现它为每个公司 ID 创建了 3 个包,并且包 ID 相同。因为我认为第四个当它试图用两个 ids 4 构建它并且我只插入 3 个包时外键失败。 我的代码有什么问题?
我认为您的第一个错误是数据库设计。您的公司将有不止一个包裹,据我所知,当时只有一个活动包裹。因此它需要在您的 companies
和 packages
table 之间创建多对多关系,如下所示:
Schema::create('rel_company_package', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->unsignedInteger('package_id');
$table->unsignedInteger('company_id');
$table->timestamp('activated_at')->nullable();
$table->timestamp('expires_at')->nullable();
$table->boolean('is_active')->nullable();
$table->unsignedInteger('nubmer_of_remaining_job_posts');
});
- actived_at:贵公司激活套餐的日期。
- nubmer_of_remaining_job_posts:首先来自您的包裹数据,您的公司发布职位后将减少一个。
- expires_at:当您的包裹过期时
- is_active:这个字段是多余的,但会帮助你花费更多的内存而不是计算资源。将确定当前分配的包是否处于活动状态
Note: you should fill in
activated_at
,expires_at
andis_active
with proper values as soon as decide to activate the package.Also you should fill in
nubmer_of_remaining_job_posts
at package assignment time.
您决定播种的是您可能不依赖于生产时间的日志数据,因为它很容易变得庞大并且需要大量资源来计算您想要的内容。顺便说一句,日志数据 (PackageUsage
) 应该只保留你的枢轴 table 的 (rel_company_package
) id
.
让我们直接回到你的错误:
首先在你的 company factory
中加载所有包并随机选择一个(你的 package usage factory
是),你最好不要这样做而是让 MySQL 选择一个随机给你一个
随机公司:
$company = $\App\Models\Company::query()->inRandomOrder->first();
// and use $company->id
随机包装:
$package = \App\Models\Package::query()->inRandomOrder()->frist();
// and use $package->id
另一点是,您应该创建一个 PackageUsage
实例,如下所示:
$company->packageUsages()->save(factory(\App\Models\PackageUsage::class)->make([
'package_id' => $company->first()->package_id
]));
不需要再次通过company_id
。似乎您错过了 Company
模型中的 packageUsages()
方法,它应该是:
public function packagesUsage()
{
return $this->hasMany('\App\Models\PackageUsage', 'company_id')
}
这可能是您将 comapny_id
替换为 package_id
的打字错误所致。
但是正如我一开始提到的,你最好先修复你的结构。