2017-03-29 3 views
0

Wir wollen Composite Primärschlüssel mit Eloquent ORM und Laravel 5 für http://www.mbarendezvous.com/ implementieren Ich verstehe, dass es derzeit nicht von Eloquent unterstützt wird. Bitte schlagen Sie vor, was die beste Alternative für die gleiche sein sollte.Composite Primärschlüssel mit Eloquent

+0

Mögliches Duplikat [Wie ich 5 zusammengesetzte Schlüssel in Modellen in Laravel setzen kann?] (Https://stackoverflow.com/questions/31415213/how-i-can-put-composite-keys-in- models-in-laravel-5) –

Antwort

-1

können Sie überschreiben die Methode save() auf Ihrer Klasse, Modell erweitert, das Composite-Tasten wie folgt hat:

public function save(array $options = array()) 
{ 
    $query = $this->newQueryWithoutScopes(); 
    // MY MODEL SPECIFIC FIX 
    $query->where('OTHER_ID', '=', $this->OTHER_ID); 
    // END MY FIX 

// the rest of the standard model->save() code is here but I cut it out for brevity. 
// Use what is in Model.php already. 
} 

Ich sah diese Lösung hier: https://github.com/laravel/framework/issues/5517

+0

Dies ist perfekt für ein Update, aber es wird nicht korrekt funktionieren, wenn das Modell erstellt wird. –

-1

in der Migration der folgenden verwenden

$table->primary(['first', 'last']); 

Ref-Link: https://laravel.com/docs/5.4/migrations#indexes

+1

Dies fügt einen Index und Einschränkungen hinzu. Aber eloquent funktioniert immer noch nicht mit zusammengesetzten Schlüsseln. –

1

Sie können die setKeysForSaveQuery-Methode aus Laravels Model-Klasse überschreiben. Sie können diese Methode wie folgt ändern:

/** 
* Set the keys for a save update query. 
* 
* @param \Illuminate\Database\Eloquent\Builder $query 
* @return \Illuminate\Database\Eloquent\Builder 
*/ 
protected function setKeysForSaveQuery(Builder $query) 
{ 
    $query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery()); 
    $query->where('secondKeyName', $this->secondKeyName); // <- added line 

    return $query; 
} 
2

Ich verwende den folgenden Code. Es überschreibt die ursprünglichen Model.php-Methoden und berücksichtigt alle Primärschlüssel. Setzen Sie diese in das Modell, das einen zusammengesetzten Primärschlüssel verwendet:

protected function getKeyForSaveQuery() 
{ 

    $primaryKeyForSaveQuery = array(count($this->primaryKey)); 

    foreach ($this->primaryKey as $i => $pKey) { 
     $primaryKeyForSaveQuery[$i] = isset($this->original[$this->getKeyName()[$i]]) 
      ? $this->original[$this->getKeyName()[$i]] 
      : $this->getAttribute($this->getKeyName()[$i]); 
    } 

    return $primaryKeyForSaveQuery; 

} 

/** 
* Set the keys for a save update query. 
* 
* @param \Illuminate\Database\Eloquent\Builder $query 
* @return \Illuminate\Database\Eloquent\Builder 
*/ 
protected function setKeysForSaveQuery(Builder $query) 
{ 

    foreach ($this->primaryKey as $i => $pKey) { 
     $query->where($this->getKeyName()[$i], '=', $this->getKeyForSaveQuery()[$i]); 
    } 

    return $query; 
} 

EDIT: Vergessen Sie nicht, die folgenden in Ihrem Modell Klasse hinzuzufügen, sonst wird dies nicht funktionieren.

public $incrementing = false; 
+1

Das funktionierte, sobald ich 'public $ incrementing = false;' an die Spitze meines Modells setzte. – Skrrp

+1

Ja, guter Kommentar! Es hat auch eine Weile gedauert, bis ich es herausgefunden habe :) –

Verwandte Themen