2016-12-12 2 views
0

J'ai une table organizations. Cette table a un id principal (int 10, unsigned, AUTO_INCREMENT).La contrainte de clé étrangère échoue sur le champ NULLable

Dans la table organizations, j'ai également une clé étrangère à l'iself: main_organization_id. Cela a les attributs suivants: (int 10, unsigned, nullable, vide: TRUE, par défaut: NULL).

Chaque fois que je crée une nouvelle organisation:

$organization = Organization::create($request->all()); 

Sans main_organization_id dans ma demande, il échoue avec l'erreur suivante:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (myDB . organizations , CONSTRAINT organizations_main_organization_id_foreign FOREIGN KEY (main_organization_id) REFERENCES organizations (id)) (SQL: insert into organizations (main_organization_id) values ())

Mais pourquoi cette échec? Le champ est nullable, cela signifie-t-il que je dois implicitement définir main_organization_id à null dans la demande?

Mon $fillable:

protected $fillable = [ 
     'main_organization_id', 
    ]; 

Ma migration:

Schema::table('organizations', function (Blueprint $table) { 

    $table->integer('main_organization_id')->unsigned()->nullable(); 
    $table->foreign('main_organization_id')->references('id')->on('organizations'); 
});**strong text** 

Je veux éviter le code comme ceci: $request['main_organization_id'] = null; avant de créer ma nouvelle ligne. Est-ce possible?

Merci d'avoir lu.

+0

Pouvez-vous vérifier ce qui est dans votre requête ($ request-> all()) à partir de l'erreur SQL, il semble qu'il soit vide ou seul champ est passé - main_organization_id – michaeltintiuc

+0

Si vous envoyez le champ main_organization_id à travers un formulaire peut créer une méthode "setter" sur votre modèle pour vérifier les valeurs vides et les convertir en null – michaeltintiuc

Répondre

1

Oui, vous devez spécifier la valeur du champ tout en créant une organisation, vous devriez le faire comme ceci:

$organization = Organization::create(array_merge([ 
    'main_organization_id' => null, 
], request()->all())); 

Hope this helps!