2016-03-30 18 views
1

Ben laravel'de test yapmak için yeniyim ve Model Fabrikaları kullanarak yapay veriler oluşturmaya çalışıyorum.Laravel'deki fabrika ilişkileri kullanılarak bütünlük kısıtlaması ihlali 5.2

  • firmaları
  • istemcileri
  • külot

bir firma birçok müşterisi var ve bir istemci birçok külot vardır: Üç tablo var. clients ve briefs formatı çok benzer. İkisi de firm_id ve client_id numaralı yabancı tuşlara sahiptir. Ben bir firmadan bir istemci bir örneğini oluşturmak istediğiniz bir PHPUnit testi ve aşağıdaki kodu kullanarak istemciden bir kısa örneğini yapıyor iken:

$client = $firm->clients() 
       ->save(factory(App\SearchFirmClient::class)->create()); 
$brief = $client->briefs() 
       ->save(factory(App\SearchFirmBrief::class)->create()); 

$client bir karışıklık olmadan oluşturulan ancak $brief bir yukarı atar edilir hata: Her iki tablo

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)) 

formatları: ea için

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(); 
}); 

modeli fabrika ch:

$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, 
    ]; 
}); 

ilişkiler:

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'); 
    } 
} 

cevap

0

Sayı # 1

Orada külot masaya hiçbir id kolon ama istemciler masanın üzerine başvuruyorsunuz. breif_id

Schema::create('search_firms_clients', function(Blueprint $table) 
{ 
    $table->increments('client_id'); 
    $table->integer('search_firm_id')->unsigned(); 
    $table->foreign('search_firm_id') 
      ->references('brief_id') // <-- Change this 
      ->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(); 
}); 

Sayı # 2

yabancı anahtarı değiştir Bir user_id üyesi yok.

$factory->define(App\SearchFirmBrief::class, function ($faker) { 
    return [ 
     'client_id'  => 1, // <-- change this 
     'title'   => $faker->sentence(3), 
     'description' => $faker->text(), 
     'contact_id' => 0, 
    ]; 
}); 

Sonuç

Size laravel isimlendirme standartları takip ederseniz, o (yani kullanım varsayılan tablo adlarının birincil anahtar adları) gelecek size çok baş ağrısı kazandıracak iyi olurdu

+0

'search_firms_clients' tablosu, birincil anahtarının 'id' olan' search_firm' tablosuna başvurur. 'İstemciler 'modeli oluşturuldu, sorun yok. Sorun, yeni oluşturulan “müşteriler” modelini referans alan “briefs” modeliyle ilgilidir. –

+0

Bir 'artisan migrate: refresh' çalıştırmayı deneyin veya DB'yi el ile silin ve geri alın –

İlgili konular