2017-10-20 6 views
0

Il y a eu beaucoup de problèmes à ce sujet mais je suis la procédure exacte pour résoudre ce problème comme décrit dans les autres questions SO connexes mais je reçois la même erreur.Colonne non trouvée: 1054 Colonne inconnue 'id' dans 'where clause' - Laravel

Boutique

public function products() 
    { 
     return $this->hasMany('App\Product'); 
     //->withTimestamps(); 
    } 

Produit

public function shop() 
    { 
     return $this->belongsTo('App\Shop');  
     //->withTimestamps(); 
    } 

Voici comment mon schéma ressemble

Schema::create('products', function (Blueprint $table) { 
       $table->increments('product_id'); 
       $table->integer('shop_id')->unsigned()->nullable(); 
       $table->foreign('shop_id')->references('id')->on('shops'); 

       $table->timestamps(); 
); 

Controller

$products = new Product(array(
      'name' => $request->('name'); 
     )); 

     $shop->products()->save($products); 

Après avoir soumis mes données de formulaire dans la table des produits, je reçois une erreur Column not found: 1054 Unknown column 'id' in 'where clause'. Laravel par défaut semble prendre id par défaut comme ma clé primaire, mais c'est product_id.

Dans mon modèle, j'ai spécifié protected $primaryKey = 'product_id' et cela ne résoudrait pas mon problème. Qu'est-ce que je fais différemment?

+1

pourriez-vous afficher la requête que vous faites dans le contrôleur? –

+0

La table 'products' n'a pas de colonne' id', elle a 'product_id'. '-> where ('product_id', '=', ...)' et non '-> where ('id', '=', ...)' – ljubadr

+0

@RusbenGuzman mis à jour ... les magasins aux produits est un une à plusieurs relation –

Répondre

0

Si vous utilisez des itinéraires de resoure, vous devez indiquer le nom de la clé d'itinéraire ainsi:

public function getRouteKeyName() 
{ 
    return 'product_id'; 
} 
1

Dans les relations que vous devez indiquer le nom de la clé primaire quand il est pas appelé id, essayez de changer le modèle comme celui-ci:

BOUTIQUE

public function products() 
    { 
     return $this->hasMany('App\Product', 'product_id'); 
     //->withTimestamps(); 
    } 

dU PRODUIT

public function shop() 
    { 
     return $this->belongsTo('App\Shop', 'product_id');  
     //->withTimestamps(); 
    } 

Dans la documentation explique comment cela fonctionne: https://laravel.com/docs/5.5/eloquent-relationships#one-to-many

+0

Toujours la même erreur –

+0

Avez-vous le nom de la table spécifiée dans le modèle? –

+0

Oui ... 'protected $ table = 'shops' et' 'protected $ table = 'products' spécifiés respectivement –

0

J'avais essayé avec mon local avec ce qui suit:

Schéma:

Schema::create('shops', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->timestamps(); 
}); 

Schema::create('products', function (Blueprint $table) { 
    $table->increments('product_id'); 
    $table->string('name'); 
    $table->integer('shop_id')->unsigned()->nullable(); 
    $table->foreign('shop_id')->references('id')->on('shops'); 
    $table->timestamps(); 
}); 

Modèle relation exactement le même que votre poster.

Code contrôleur:

$shop = new Shop; 
$shop->name = 'test'; 
$shop->save(); 

$products = new Product; 
$products->name = 'test'; 

$shop->products()->save($products); 

Et résultat final? Il est enregistré dans la table des produits sans erreur. J'utilise Laravel 5.4 chez moi.

Quand il a déclaré Unknown column 'id' in 'where clause' mais est-il indiqué est la table des produits? Pouvez-vous afficher le journal des erreurs Sql complet?

Je soupçonne qu'il pourrait être une autre relation causée l'erreur.

+0

J'ai changé product_id simplement en id et ça marche en ce moment –

+0

Avez-vous essayé' public $ primaryKey =' product_id '' au lieu de protégé? – Momo

+0

Non, je ne l'ai pas essayé mais je vais essayer et vous faire savoir –