2016-07-11 10 views
2

ich Laravel gerade erst begonnen und alles, was ich tun möchte, ist folgende Abfragein Eloquent Arbeit erhalten:
ON DUPLICATE KEY UPDATE in Eloquent

INSERT INTO geschichte (geschichte_id, 
         geschichte_text1, 
         geschichte_text2, 
         geschichte_text3) 
VALUES (:geschichte_id, 
     :geschichte_text1, 
     :geschichte_text2, 
     :geschichte_text3) 
ON DUPLICATE KEY 
UPDATE geschichte_id = :geschichte_id, 
     geschichte_text1 = :geschichte_text1, 
     geschichte_text2 = :geschichte_text2, 
     geschichte_text3 = :geschichte_text3; 

Reglerfunktion

public function alterGeschichte(Request $request) 
{ 
    $geschichte1 = new Geschichte; 
    $geschichte2 = new Geschichte; 
    $geschichte3 = new Geschichte; 

    $geschichte1 = Geschichte::updateOrCreate(
     ['id' => 1], 
     ['geschichte_text1' => $request->geschichte_text1] 
    ); 
    $geschichte2 = Geschichte::updateOrCreate(
     ['id' => 2], 
     ['geschichte_text2' => $request->geschichte_text2] 
    ); 
    $geschichte3 = Geschichte::updateOrCreate(
     ['id' => 3], 
     ['geschichte_text3' => $request->geschichte_text3] 
    ); 

    $geschichte1->save(); 
    $geschichte2->save(); 
    $geschichte3->save(); 

    return redirect('/geschichte'); 
} 

Das Problem im Detail

Ich kann den Teil 'auf doppelte Schlüsselaktualisierung' nicht funktionieren.
Es wird immer ein neuer Eintrag für jedes Update erstellt. Ich möchte, dass die ID für jeden Eintrag immer gleich ist und nur den älteren Eintrag mit dieser ID überschreiben.

Ich wäre sehr dankbar für jede Art von Hilfe. Ich kämpfe mit dieser von Stunden ...

UPDATE

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateGeschichteTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('geschichte', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->text('geschichte_text1'); 
      $table->text('geschichte_text2'); 
      $table->text('geschichte_text3'); 
      $table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('geschichte'); 
    } 
} 
+0

können Sie die CREATE-Table-Anweisung hinzufügen. Ist die ID als Primärschlüssel festgelegt und haben Sie andere Primärschlüssel in der Tabelle? – fehrlich

+0

@XzenTorXz Ich habe die Frage aktualisiert. Die ID ist der einzige Primärschlüssel. – Schwesi

+0

Warum machen Sie vor updateOrCreate neue Modelle? –

Antwort

2

Das meiste, was in Ihrem Controller ist nicht notwendig sein sollte. Ich bin auch ein wenig besorgt über die Datenbankstruktur, die Sie verwenden, warum Sie eine Aufgabe wie in Ihrem Controller gezeigt ausführen würden. Folgendes sollte alles sein, was Sie brauchen:

public function alterGeschichte(Request $request) 
{ 
    Geschichte::updateOrCreate(
     ['id' => 1], 
     ['id' => 1, 'geschichte_text1' => $request->geschichte_text1] 
    ); 

    Geschichte::updateOrCreate(
     ['id' => 2], 
     ['id' => 2, 'geschichte_text2' => $request->geschichte_text2] 
    ); 

    Geschichte::updateOrCreate(
     ['id' => 3], 
     ['id' => 3, 'geschichte_text3' => $request->geschichte_text3] 
    ); 

    return redirect('/geschichte'); 
} 

Wenn diese neue Datensätze erstellen, ist es sehr wahrscheinlich, weil es kein Datensatz mit diesem IDs ist.

+0

Du hast mir schon enorm geholfen. Es wird jedoch immer noch eine neue ID für jeden Eintrag erstellt. Obwohl ich möchte, dass ID 1 immer ID 1 ist. Könntest du mir dabei helfen? – Schwesi

+1

Ich habe meinen Post bearbeitet um zu haben, was funktionieren soll; Sie sollten sich jedoch wirklich fragen, ob Sie sie nach ID identifizieren sollten. Es wäre viel besser, neben der ID eine andere Spalte zu verwenden, um Ihre Tabelle zu aktualisieren. –

+0

Funktioniert perfekt !! Vielen herzlichen Dank!!! – Schwesi

4

Es sieht so aus, als hätten Sie keine eindeutige Schlüsseleinstellung für die Spalten, die Sie eindeutig haben möchten. Um on duplicate key update zu verwenden, benötigen Sie das, damit Ihr Datenbankserver weiß, ob er eingefügt oder aktualisiert werden muss.

Leider hat Laravel keine Unterstützung für on duplicate key update Syntax. Dies wäre nützlich, weil es versucht einzufügen und wenn es bereits in der Tabelle ist, dann wird es die Spalten entsprechend in einer Abfrage aktualisieren.

Mit Laravels updateOrCreate-Methode fragt es zuerst die Tabelle ab, um festzustellen, ob es eine Einfüge- oder Aktualisierungsanweisung generieren muss, und fährt dann entsprechend fort. Sie erhalten nicht den Vorteil, nur eine Abfrage auszuführen, aber gleichzeitig ist es Laravel, das die gesamte zusätzliche Logik verarbeitet, so dass es ein kleiner Kompromiss ist.