it-swarm.com.de

\ Drupal :: database () -> insert - Fehler: Aufruf einer undefinierten Methode Using -> condition ()?

Ich versuche, eine neue Zeile basierend auf den Bedingungen einzufügen. Die ->condition() in $database->update() funktioniert gut, in $database->insert() nicht.

$database = \Drupal::database();

// Query our DB.
$queryDB = $database
  ->select('table_name', 'value3')
  ->fields('value3')
  ->condition('value1', $value1, "=")
  ->condition('value2', $value2, "=")
  ->execute()->fetchAll();

if (isset($queryDB[0])) {
  // Check if table row exists and overwrite.
  if ($queryDB[0]->value1 == $value1 && $queryDB[0]->value2 == $value2) {
    $database
      ->update('table_name')
      ->fields([
        'value3' => $value3,
      ])
      ->condition('value1', $value1, '=')
      ->condition('value2', $value2, '=')
      ->execute();
  }
}
// Create table row.
else {
  $database
    ->insert('table_name')
    ->fields([
      'value1' => $value1,
      'value2' => $value2,
      'value3' => $value3,
    ])
    // Without these conditions, I get a duplicate entry integrity restraint as value1 and/or value2 may already exist.
    // With them I get Error: Call to undefined method Drupal\Core\Database\Driver\mysql\Insert::condition().
    ->condition('value1', $value1, '!=')
    ->condition('value2', $value2, '!=')
    ->execute();
}

Sehr ähnliche Fragen: 1. EntityQuery-Bedingung "ist nicht gleich ..." 2. Wie füge ich einer Abfrage eine Bedingung hinzu?

Aber ich habe kein Glück. Ist es anders mit einem Einsatz?

Ich möchte, dass, wenn Wert1 UND Wert2 nicht übereinstimmen, eine völlig neue Tabellenzeile mit allen drei Werten erstellt wird.

3
Prestosaurus

Wie in Insert Queries beschrieben, verfügt das von \Drupal::database()->insert() zurückgegebene Objekt nicht über eine condition() -Methode. Wenn der Zweck des Codes darin besteht, eine neue Datenbankzeile zu erstellen, falls diese nicht vorhanden ist, oder sie zu aktualisieren, falls sie bereits vorhanden ist, sollte der Code das von \Drupal::database()->merge() zurückgegebene Objekt verwenden. Siehe Abfragen zusammenführen .

Der folgende Code erstellt beispielsweise eine neue Zeile, wenn keine der vorhandenen Zeilen den Wert $name Für die Datenbankspalte name enthält. Andernfalls wird die vorhandene übereinstimmende Zeile aktualisiert. ($connection Ist das Objekt, das von \Drupal::database() oder einem Connection Objekt zurückgegeben wird, das durch Abhängigkeitsinjektion erhalten wurde.)

$connection->merge('example')
  ->key(['name' => $name])
  ->fields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->execute();

Es ist auch möglich, einen Satz von Werten zu verwenden, wenn die Zeile erstellt wird, und einen anderen Satz, wenn die Zeile aktualisiert wird.

$connection->merge('example')
  ->insertFields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->updateFields([
    'field1' => $alternate1,
  ])
  ->key(['name' => $name])
  ->execute();

Auf dieser Dokumentationsseite wird nicht gezeigt, wie mehrere Schlüssel verwendet werden, wie im folgenden Code: Merge::keys() anstelle von Merge::key() .

$connection->merge('example')
  ->insertFields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->updateFields([
    'field1' => $alternate1,
  ])
  ->keys(['name' => $name, 'nickname' => $nickname])
  ->execute();

Die einzige Einschränkung besteht darin, dass die an keys() übergebenen Werte alle verwendet werden, um einer einzelnen Datenbankzeile zu entsprechen. Mit anderen Worten, das letzte Snippet, das ich gezeigt habe, sucht nicht nach einer Zeile mit $name In der Datenbankspalte name oder eine Zeile mit $nickname In der Spalte Spitzname.

In komplexeren Fällen, in denen die Klasse Merge nicht hilft, müssen Sie zuerst überprüfen, was die Datenbanktabelle enthält, und die erforderlichen Maßnahmen basierend auf dem Tabelleninhalt ergreifen (wobei mehr PHP Code zum Überprüfen des Datenbankinhalts).

5
kiamlaluno

Ja, das ist anders. Eine SQL INSERT -Anweisung hat keine WHERE -Klausel, daher existiert die erwähnte condition() l-Methode für die insert object nicht .

Sie können Ihren bedingten Check-in PHP Code (z. B. $queryDB[0]->value1 != $value1) So hinzufügen, wie Sie es redundant für Ihre UPDATE Abfrage getan haben.

2
Shawn Conn