db_or () в hook_query_TAG_alter? - PullRequest
       6

db_or () в hook_query_TAG_alter?

0 голосов
/ 19 августа 2011

Я новичок в Drupal 7, но не в Drupal.Я боюсь, однако, что новая система запросов к базе данных немного над моей головой.

Я пытаюсь изменить запрос представления, используя hook_query_TAG_alter().По сути, я пытаюсь добавить OR к фильтру, говоря «перечислите узлы, на которые текущий пользователь либо ссылается в конкретном поле, либо OR является автором».

Я пытаюсь добавить это последнее условие(или автор) делает это, добавляя db_or()->condition(…) к запросу, но я продолжаю получать фатальную ошибку:

Вызов неопределенного метода SelectQuery :: db_or () в / Volumes /...

Это сводит меня с ума, потому что я недостаточно разбираюсь в этой системе, чтобы понять, почему этот метод недоступен.Вот моя реализация:

function sentinel_network_query_views_networks_alter(QueryAlterableInterface $query) {
  $query->db_or()->condition('node.uid', '***CURRENT_USER***', '=');
}

Ответы [ 2 ]

1 голос
/ 19 августа 2011

db_or() возвращает экземпляр условия базы данных, поэтому вам необходимо передать его в качестве условия. Кроме того, вам нужно более одного условия в db_or() для фактического выполнения или!

$or = db_or()
  ->condition('node.uid', '***CURRENT_USER***', '=')
  ->condition('node.nid', 'SECOND CONDITION');
$query->condition($or);

Надеюсь, что помогает

0 голосов
/ 20 августа 2011

db_or () - это функция, а не метод.

В качестве примера использования db_or() вы можете посмотреть пример кода, приведенный для hook_query_TAG_alter ():

  $access_alias = $query->join('node_access', 'na', '%alias.nid = n.nid');
  $or = db_or();
  // If any grant exists for the specified user, then user has access to the node for the specified operation.
  foreach (node_access_grants($op, $query->getMetaData('account')) as $realm => $gids) {
    foreach ($gids as $gid) {
      $or->condition(db_and()
        ->condition($access_alias . '.gid', $gid)
        ->condition($access_alias . '.realm', $realm)
      );
    }
  }

  if (count($or->conditions())) {
    $query->condition($or);
  }

  $query->condition($access_alias . 'grant_' . $op, 1, '>=');

$query->condition() не заменяет существующее условие;это добавляет новое условие.В SelectQuery :: __ construct () , SelectQuery::$where (который содержит объект DatabaseCondition для запроса) инициализируется с использованием следующего кода:

 $this->where = new DatabaseCondition('AND');

Это означает, что всеусловия, добавленные к объекту SelectQuery, будут соединены друг с другом с помощью оператора «И».

...