2016-08-29 1 views
0

Es gibt eine Tabelle in der Datenbank mit den folgenden anfänglichen Migrationen zu wissen:Ärger mit Eloquent tatsächlichen primären (Composite) Schlüssel

public function up() 
    { 
     Schema::create('products_markets', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('product_id')->unsigned(); 
      $table->foreign('product_id')->references('id')->on('products'); 
      $table->integer('country_code_id')->unsigned(); 
      $table->timestamp('created_at')->useCurrent(); 
      $table->timestamp('updated_at')->useCurrent(); 
     }); 

    $sql = 'ALTER TABLE `products_markets` ADD UNIQUE `unique_index`(`product_id`, `country_code_id`)'; 
    DB::connection()->getPdo()->exec($sql); 
} 

/** 
* Reverse the migrations. 
* 
* @return void 
*/ 
public function down() 
{ 
    Schema::dropIfExists('products_markets'); 
} 

Und alles war in Ordnung; aber sobald es war realized dass es keinen Sinn eine automatische Primärschlüssel id eine neue Migration zu haben, machte gemacht wurde:

public function up() 
    { 
     Schema::table('products_markets', function (Blueprint $table) { 
      DB::unprepared("ALTER TABLE products_markets ADD INDEX country_code_id (country_code_id)"); 
      DB::unprepared('ALTER TABLE products_markets MODIFY id INT NOT NULL'); 
      DB::unprepared('ALTER TABLE products_markets DROP PRIMARY KEY'); 
      DB::unprepared('ALTER TABLE products_markets DROP COLUMN id'); 
      DB::unprepared('ALTER TABLE products_markets ADD PRIMARY KEY (country_code_id, product_id)'); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::table('products_markets', function (Blueprint $table) { 
      DB::unprepared('DROP INDEX country_code_id ON products_markets'); 
      DB::unprepared('ALTER TABLE products_markets DROP PRIMARY KEY'); 
      $table->increments('id'); 
     }); 
    } 

Während dieser Code auf unserem Server arbeitet und auf einigen lokal, Maschinen scheinen andere Maschinen Fehler während der Tests zu werfen:

Product :: test_scopeMarket_only_returns_products_for_user_country Illuminate \ Database \ QueryException: SQLSTATE [42S22]: Column nicht gefunden: 1054 Unknown column 'id' in 'WHERE-Klausel' (SQL: update products_marketscountry_code_id = 121 gesetzt, updated_at = 2016.08.29 17.05.21 wo id null ist)

Der Test in Frage Fehler auf der folgenden Zeile:

$products[0]->markets()->first()->update(['country_code_id' => 121]); 

Wir haben Komponist dumpautoload, re-migrierende, Cache zu löschen; jedoch scheint nichts zu helfen. Hat dies mit DB::unprepared zu ALTER Tabellen zu tun?

+0

Sie sollten alle Abfragen neu schreiben, wo id mit einem neuen Primärschlüssel verwendet wurde ('product_id',' country_code_id') –

+0

Ich denke, ich sollte ausarbeiten, dass ID in keiner Abfrage verwendet wird. –

+0

Es scheint, dass es irgendwo im Testcode verwendet wird. –

Antwort

1

Die Antwort ist, dass eloquent does not support composite primary keys.

Wenn Sie laufen:

$products[0]->markets()->update(['country_code_id' => 121]);

es läuft; jedoch, wenn Sie laufen:

$products[0]->markets()->get()->update(['country_code_id' => 121]);

es wird scheitern, weil zuerst() ein Modell zurückgibt und das Standardmodell primaryKey ist id und Verbund primaryKey s werden nicht von Eloquent behandelt.

+0

Ach, ein weiterer Fall von Software von Drittanbietern, der in die Quere kommt. –

Verwandte Themen