it-swarm.com.de

Fügen Sie eine Unterabfrage in einer WHERE-Bedingung hinzu, indem Sie hook_views_query_alter () verwenden.

Ich habe versucht, eine Unterabfrage wie die folgende hinzuzufügen:

function mymodule_views_query_alter(&$view) {
  $view->query->where[1]['conditions'][] = array(
    'field' => 'node.nid',
    'value' => 'SELECT SUBSTRING(source, 6) FROM {url_alias} WHERE alias LIKE "pros/%"',
    'operator' => 'in',
  );
}

Ich habe einen speziellen Fall, in dem Knoten mit Aliasnamen erstellt werden, die mit pros/ Beginnen oder nicht, und ich möchte nur diese erhalten.

In einer einfachen SQL-Rohabfrage würde ich Folgendes tun:

SELECT *
FROM node node
WHERE node.nid IN (SELECT SUBSTRING(source, 6)
                   FROM {url_alias}
                   WHERE alias LIKE "pros/%")

Aber ich kann nicht herausfinden, wie man das mit hook_views_query_alter() macht.

5

Am Ende ging ich durch hook_views_pre_execute() und benutzte ein LEFT JOIN ..

function mymodule_views_pre_execute($view) {
  $query = $view->build_info['query'];
  $query->leftJoin('url_alias', 'u', 'node.nid = substr(u.source, 6)');
  $query->where("u.alias LIKE 'pros/%'");
}

Etwas, das mich auslöste, war, dass ich einfache Anführungszeichen um LIKE verwenden musste, es funktionierte nicht mit doppelten Anführungszeichen.

2

Idealerweise denke ich, dass es das Recht hat, views_join_subquery zu verwenden. Die von Ihnen verwendete Unterabfrage mit dem Schlüsselwort IN ist jedoch immer langsam und führt zu demselben Ergebnis wie die Verwendung eines LEFT JOIN Beitritt mit node.nid Feld.

Sie können versuchen, ein views_join zu erstellen und das url_alias table by add_field method, während die Knotentabelle die linke Tabelle ist.

Ich habe den Code momentan nicht, aber Sie können sich die folgenden Links ansehen.
https://stackoverflow.com/questions/6851945/add-table-join-where-and-order-by-to-views-query-in-views-query-alter =
http://www.wordpressecoder.com/2014/01/how-to-alter-views-query-with-multiple.html
http://www.yellowpencil.com/blog/last-ditch-fix-programmatic-changing-drupal-7-view

2

Es gibt ein großartiges Beispiel für die Durchführung von Unterabfragen in der Integration von Taxonomy Views. Sie können es in views_handler_argument_term_node_tid_depth :: query () sehen.

Letztendlich besteht der Trick jedoch darin, dass Sie mit db_select() eine gesamte Unterabfrage erstellen und dann das gesamte resultierende Objekt mit der Methode add_where () zum Views-Abfrageobjekt hinzufügen.

function mymodule_views_query_alter(&$view) {
  $sub_query = db_select('foo', 'f')
    ->fields('f', array('nid'))
    ->condition('f.bar', 'baz');
  $view->query->add_where(0, 'node.nid', $subquery, 'IN');
}

Diese Möglichkeit, eine ausgewählte Unterabfrage zu verwenden, ist in der Dokumentation Views add_where () dokumentiert (leider wird das Beispiel aufgrund des Renderns auf api.drupal.org nicht angezeigt).

Sie können das where wahrscheinlich auch manuell zum Array $view->query->where[1]['conditions'] Hinzufügen. Es wird jedoch empfohlen, die Methode zu verwenden, anstatt das Array direkt zu bearbeiten.

1
Nate Lampton