it-swarm.com.de

Verwenden Sie einen anderen Feldwert als Bedingung in der Entitätsabfrage

Ich führe in Drupal 8 an Entitätsabfrage aus, das nach Knoten sucht, die seit x Tagen nicht geändert wurden, wobei x ein numerisches Knotenfeld ist (node.field_days Ich möchte also eine Abfrage durchführen wie:

$query = \Drupal::entityQuery("node")
  ->condition('changed', strtotime('-node.field_days days'), '<=');

Ich weiß, dass diese Bedingung eine Zeichenfolge und keine Datenbankspalte als Wert annimmt. Ist es jedoch möglich, eine Entitätsabfrage mit einem dynamischen Wert zu verwenden?

2
Maria Ioannidou

Die Entitätsabfrage ist ein leistungsstarkes und praktisches Tool zum Abfragen von Inhalts- und Konfigurationsentitäten mit bestimmten Eigenschaften/Feldwerten/Feldreferenzen.

Es hat jedoch seine Grenzen. Der Vergleich zweier Felder ist mit der generischen Entitätsabfrage und ihrer Bedingungsmethode nicht möglich.

Für eine solche Aufgabe müssen Sie möglicherweise die niedrigere Ebene dynamische (ausgewählte) Abfragen und deren wo Methode verwenden. Ein Beispiel für Ihren Anwendungsfall:

$connection = \Drupal::database();
// Query node base field table.
$query = $connection->select('node_field_data', 'n');
// Join with the `field_days` field table.
$query->leftjoin('node__field_days', 'd', 'd.entity_id = n.nid');
// Query for the node ID.
$query->fields('n', ['nid']);
// Your condition (a day has 86400 seconds; we multiply them with
// the value of the field_days field, add them to the changed
// timestamp of the node and compare it against the current time).
$query->where('n.changed + (d.field_days_value * 86400) <= :now', [
  ':now' => \Drupal::time()->getCurrentTime(),
]);
// Optional sorting.
$query->orderBy('n.changed', 'DESC');
// Fetch results.
$result = $query->execute()->fetchAllKeyed(0, 0);

Das obige Beispiel setzt voraus:

  1. dass Sie einen numerischen Feldtyp für field_days, so dass der in der Datenbank gespeicherte Wert ohne Casting mit Sekunden multipliziert werden kann,
  2. dass die field_days Feld erlaubt nur einen Wert, so dass wir Felddeltas beim Verbinden sicher ignorieren können,
  3. das field_days ist auf allen Knoten/Bündeln vorhanden und hat einen gültigen Wert.
  4. dass Sie nur eine Sprache in Ihrer Site verwenden/das field_days value ist nicht übersetzbar, daher können wir auch Langcodes ignorieren.

Möglicherweise müssen Sie die Abfrage entsprechend ändern, wenn eine dieser Annahmen nicht zutrifft.

4
Mario Steinitz