Я новичок в тестировании в laravel, и я пытаюсь создать фиктивные данные с использованием фабрик моделей. У меня есть три таблицы:Нарушение ограничения целостности с использованием фабричных отношений в laravel 5.2
- фирмы
- клиентов
- трусы
Фирма имеет много клиентов, и клиент имеет много записок. Формат clients
и briefs
очень похожи. Они оба имеют внешние ключи firm_id
и client_id
почтительно. Хотя делать тест PHPUnit я хочу, чтобы создать экземпляр клиента от фирмы и экземпляр краткого от клиента, используя следующий код:
$client = $firm->clients()
->save(factory(App\SearchFirmClient::class)->create());
$brief = $client->briefs()
->save(factory(App\SearchFirmBrief::class)->create());
$client
создаются без суеты, но $brief
подбрасывает ошибка:
Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'client_id' cannot be null (SQL: insert into `search_firms_briefs` (`user_id`, `title`, `description`, `contact_id`, `client_id`, `updated_at`, `created_at`) values (1, Et in amet., Quo soluta ut impedit nesciunt autem. Laborum aperiam est non molestiae animi non quod. Explicabo eligendi doloribus ex quia vitae placeat ut., 0, , 2016-03-30 10:06:34, 2016-03-30 10:06:34))
форматы обеих таблиц:
Schema::create('search_firms_clients', function(Blueprint $table)
{
$table->increments('client_id');
$table->integer('search_firm_id')->unsigned();
$table->foreign('search_firm_id')->references('id')->on('search_firms')->onDelete('cascade');
$table->string('name');
$table->softDeletes();
$table->timestamps();
});
Schema::create('search_firms_briefs', function(Blueprint $table)
{
$table->increments('brief_id');
$table->integer('client_id')->unsigned();
$table->foreign('client_id')->references('client_id')->on('search_firms_clients')->onDelete('cascade');
$table->string('title');
$table->softDeletes();
$table->timestamps();
});
модель завода для еа ч:
$factory->define(App\SearchFirmClient::class, function ($faker) {
return [
'name' => $faker->company,
'email' => $faker->companyEmail,
'phone' => $faker->phoneNumber,
'address' => $faker->address,
'website' => $faker->url,
];
});
$factory->define(App\SearchFirmBrief::class, function ($faker) {
return [
'user_id' => 1,
'title' => $faker->sentence(3),
'description' => $faker->text(),
'contact_id' => 0,
];
});
Отношение:
class SearchFirm extends Model
{
protected $table = 'search_firms';
protected $primaryKey = 'id';
public function clients() {
return $this->hasMany('SearchFirmClient', 'search_firm_id');
}
}
class SearchFirmClient extends Model
{
use SoftDeletes;
protected $table = 'search_firms_clients';
protected $primaryKey = 'client_id';
protected $dates = [ 'deleted_at' ];
public function briefs()
{
return $this->hasMany('SearchFirmBrief', 'client_id')->orderBy('updated_at', 'desc');
}
}
class SearchFirmBrief extends Model
{
use SoftDeletes;
protected $table = 'search_firms_briefs';
protected $primaryKey = 'brief_id';
protected $touches = array('client');
protected $dates = [ 'deleted_at'];
public function client() {
return $this->belongsTo('SearchFirmClient', 'client_id');
}
}
В таблице 'search_firms_clients' ссылается таблица' search_firm', первичным ключом которой является '' id''. Создана модель 'clients', без проблем. Проблема заключается в модели 'briefs', ссылающейся на новую модель' clients'. –
Попробуйте запустить «artisan migrate: refresh» или вручную удалить БД и ремигрировать –