2017-10-30 5 views
1

Also ich versuche, eine Pivot-Tabelle für "Bestellung" und "Artikel" zu machen. aber im immer ein SQL-FehlerLaravel Pivot Tabelle

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'orderline.order_order_id' in 'field list' (SQL: select `item`.*, `orderline`.`order_order_id` as `pivot_order_order_id`, `orderline`.`item_item_id` as `pivot_item_item_id`, `orderline`.`quantity` as `pivot_quantity` from `item` inner join `orderline` on `item`.`item_id` = `orderline`.`item_item_id` where `orderline`.`order_order_id` in (1, 2, 3, 4, 5)) 

das einzige, was ich den Schläger bemerken weg kann, ist „order_order_id“ sollte „order_id“ und „item_item_id“ „item_id“ aber ich bin nicht sicher.

erhalte ich diesen Fehler, wenn

$customers = Customer::with('orders.items')->get(); 
dd($customers); 

Hier Aufruf ist meine Modelle

class Customer extends Model 
{ 

public $timestamps = false; 
protected $table = "customer"; 
protected $primaryKey = "customer_id"; 

public function orders(){ 
    return $this->hasMany('App\Order','customer_id'); 
} 
} 

class Order extends Model 
{ 
/** 
* @var bool 
*/ 
public $timestamps = false; 
protected $table = "order"; 
protected $primaryKey = "order_id"; 

public function customer(){ 
    return $this->hasOne('App\Customer','customer_id'); 
} 

public function items(){ 
    return $this->belongsToMany('App\Item','orderline')->withPivot('quantity'); 
} 

} 


class Item extends Model 
{ 
/** 
* @var bool 
*/ 
public $timestamps = false; 

protected $table = "item"; 
protected $primaryKey = "item_id"; 

public function orders(){ 
    return $this->belongsToMany('App\Order','orderline')->withPivot('quantity'); 
} 

public function stock(){ 
    return $this->hasOne('App\Stock','item_id'); 
} 

} 

Hier ist meine Migrationen und Fremdschlüssel-Constraints

Order:

public function up() 
{ 
    Schema::create('order', function (Blueprint $table) { 
     $table->increments('order_id'); 
     $table->integer('customer_id')->unsigned(); 
     $table->date('date_placed'); 
     $table->date('date_shipped'); 
     $table->decimal('shipping_charge',7,2); 
    }); 
    } 

Artikel :

public function up() 
{ 
    Schema::create('item', function (Blueprint $table) { 
     $table->increments('item_id'); 
     $table->string('description',64); 
     $table->decimal('cost_price',7,2); 
     $table->decimal('sell_price',7,2); 
    }); 
} 

Orderline:

public function up() 
{ 
    Schema::create('orderline', function (Blueprint $table) { 
     $table->integer('order_id')->unsigned(); 
     $table->integer('item_id')->unsigned(); 
     $table->integer('quantity'); 
     $table->primary(['order_id','item_id']); 
    }); 
} 

FkConstraintToOrder:

public function up() 
{ 
    Schema::table('order', function (Blueprint $table) { 
     $table->foreign('customer_id')->references('customer_id')->on('customer')->onDelete('cascade'); 
    }); 
} 

FkConstraintToOrderline:

public function up() 
{ 
    Schema::table('orderline', function (Blueprint $table) { 
     $table->foreign('order_id')->references('order_id')->on('order')->onDelete('cascade'); 
     $table->foreign('item_id')->references('item_id')->on('item')->onDelete('cascade'); 
    }); 
} 

Ich glaube, ich bin etwas fehlt, aber ich bin nicht sicher, was. Jede Hilfe wäre willkommen.

+0

Bitte geben Sie auch Ihr Kundenmodell an. – manniL

+0

@manniL aktualisiert – bandnan

Antwort

0

Während Sie Ihre Pivot-Tabelle beliebig benennen können, sollten Sie sie gemäß der offiziellen Laravel-Dokumentation unter https://laravel.com/docs/5.5/eloquent-relationships anhand der beiden Tabellen, die sie verbindet, in alphabetischer Reihenfolge benennen, in diesem Fall item_order. Dadurch wird Ihr Code einfacher und einfacher zu lesen.

In Bezug auf Ihre Frage basiert die Art, wie Laravel den Namen der Spalten in der Pivot-Tabelle ermittelt, auf dem Primärschlüssel der beiden fraglichen Tabellen und trägt den Namen der Klasse vor, also seit Ihrem Primärschlüssel ist order_id wegen protected $primaryKey = "order_id"; es nimmt das und fügt den Namen der Klasse hinzu, also nennt es order_order_id. Sie können diese Funktionalität überschreiben, indem so etwas wie dies zu tun:

return $this->belongsToMany('App\Item', 'orderline', 'order_id', 'item_id'); 

Normalerweise sind die Primärschlüssel nur id ist, so ist der Schlüssel, dass Laravel würde für order_id wäre aussehen.

+0

Danke, die Überschreibung zu tun hat es behoben, es sind immer die kleinen Dinge. – bandnan