it-swarm.com.de

Wie frage ich einen Inhaltstyp mit benutzerdefinierten Feldern in der Anweisung 'condition' ab?

Ich muss einen Inhaltstyp abfragen, der die Bedingungen von benutzerdefinierten Feldern zurückgibt und filtert.

$query = db_select('node', 'n');
$query  ->fields('n',array('field_customfield1','field_customfield2'))
        ->condition('type', 'myContentType')
    ->condition('field_customfield3',$user->uid,'=')
    ->condition('field_customfield4',$anemailaddress,'=');
$foundrecord = $query->execute();

Das scheint nicht zu funktionieren. Mein Problem ist, dass ich nicht herausfinden kann, wie auf benutzerdefinierte Felder in Abfragen verwiesen wird.

Jede Hilfe sehr geschätzt!

4
Keith Savoie

Verwenden Sie dazu besser ein EntityFieldQuery :

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'myContentType')
  ->propertyCondition('status', 1) // in case you need it
  ->fieldCondition('field_customfield3', 'value', $user->uid)
  ->fieldCondition('field_customfield4', 'value', $anemailaddress);

$results = $query->execute();

if (isset($results['node'])) {
  $nodes = node_load_multiple(array_keys($results['node']));

  foreach ($nodes as $node) {
    $customerfield1 = field_get_items('node', $node, 'field_customerfield1');
    $first_value = $customerfield1[0]['value'];

    // etc...
  }
}

Obwohl es mehr Code und mehr Overhead ist, hat es Vorteile gegenüber dem direkten Zugriff auf die Datenbanktabellen.

  • Sie müssen die JOINs nicht selbst erstellen
  • EntityFieldQuery berücksichtigt Knotenrevisionen, die mit einer benutzerdefinierten Abfrage schwieriger zu verfolgen sind
  • Ihr Code ist jetzt portabel, wenn Sie das Speicher-Backend für Felder in etwas anderes als MySQL (z. B. MongoDB) ändern möchten.
11
Clive

Benutzerdefinierte Felder haben ihre eigenen separaten Tabellen. Verbinden Sie sie mit dem Knoten, indem Sie ihre entity_id mit der nid abgleichen. Anschließend können Sie sie als Bedingungen verwenden:

<?php
$query = db_select('node', 'n')
        ->fields('n',array('field_customfield1','field_customfield2'))
        ->condition('type', 'myContentType');
$query->leftJoin('field_data_field_customfield3','customfield3','n.nid = customfield3.entity_id');
$query->leftJoin('field_data_field_customfield4','customfield4','n.nid = customfield3.entity_id');
$query->condition('customfield3.field_customfield3_value',$user->uid,'=')
      ->condition('customfield4.field_customfield4_value',$anemailaddress,'=');
$foundrecord = $query->execute();
?>
1