db_select

db_query pour requete sur une unique table. db_select si LIKE, plusieurs tables... indépendant de la db (MySQL ou autre).

Ex 1 avec node_access

Le code suivant est équuivalent au SQL SELECT title, nid, created FROM {node} n WHERE n.status = 1

$result = db_select('node', 'n')
  ->addTag('node_access')                         // Enforce node access permissions.
  ->fields('n', array('title', 'nid', 'created')) // Fields to return.
  ->condition('n.status', 1)                       // WHERE condition.
  ->execute();
foreach ($result as $node) {
  // $node will be a PHP object with fields corresponding to the table fields.
  $title = $node->title;
  // ...
}

Notes:

  • db_query doit {nomtable} mais pas db_select
  • methode addTag() à utiliser si on interroge des données en pensant aux permissions.
    • certaines methodes query permettent le chaining (comme dans cet ex) parce qu'elles modifient la query et retourne un objet modifié ; d'autres non (dont addField et les methodes de jointures).
      Ex de méthode "non chaining", avec pagination, 20 items par page, et node_access:

      qui équivaut à

      SELECT n.changed AS last_updated, n.title, n.nid, u.name
      FROM {node} n
      INNER JOIN {users} u ON u.uid = n.nid
      WHERE n.status = 1

      $query = db_select('node', 'n');
      $query->addField('n', 'changed', 'last_updated');
      $query->innerJoin('users', 'u', 'u.uid = n.uid'); // Join.
      $query = $query->extend('PagerDefault');
      $result = $query
        ->fields('n', array('title', 'nid'))
        ->fields('u', array('name'))
        ->addTag('node_access')
        ->condition('n.status', 1)
        ->limit(20)
        ->execute();

      chp alias

      jointure

      pagination

       

      perm
      publié
      nb items/p

  • Si on utilise PagerDefault (comme ici plus haut) alors il faut appeller theme('pager')