Не работает запрос к бд

Главные вкладки

Аватар пользователя sotkom sotkom 14 октября 2014 в 20:17

доброго времени суток.
подскажите, пожалуйста, в чем может быть проблема.
Создал простейший модуль.
Написал функцию выборки из бд:

function dump_results(){
  $res = db_select('node', 'a')
          ->fields('a', array('nid', 'title'))
          ->range(0, 3)
          ->execute();
  while($r = $res->fetchAssoc()){
    $rr[]=$r;
  }
  var_dump($rr);
  return 'return';
}

все выводится нормально.
Но когда усложняю запрос:

function dump_results(){
  $res = db_select('node', 'a')
          ->leftJoin('field_data_body', 'b', 'b.entity_id=a.nid')
          ->fields('a', array('nid', 'title'))
          ->fields('b', array('body_value'))
          ->range(0, 3)
          ->execute();
  while($r = $res->fetchAssoc()){
    $rr[]=$r;
  }
  var_dump($rr);
  return 'return';
}

Выводится ошибка: Fatal error: Call to a member function fields() on a non-object in C:\OpenServer\domains\ubercart.ru\sites\all\modules\dump\dump.module on line 27
Подскажите, плз, в чем проблема?

Комментарии

Аватар пользователя drupby drupby 14 октября 2014 в 20:53

"sotkom" wrote:
Подскажите, плз, в чем проблема?

в игнорировании документации
прочти leftJoin() и к примеру fields()
прежде чем делать последовательный вызов методов, как минимум узнай, что каждый из них возвращает

Аватар пользователя sotkom sotkom 14 октября 2014 в 21:02

ну а конкретно можешь указать на ошибки?
или покажи как правильно составить на drupal 7 например простейший запрос: SELECT a.nid, a.title, b.body_value FROM node a LEFT JOIN field_data_body b ON b.entity_id=a.nid
?

Аватар пользователя sotkom sotkom 14 октября 2014 в 21:21

спасибо, это работает!
так а причина то в чем?
в порядке следования запросов?
или вот так писать нельзя:
->fields('a', array('nid', 'title'))
->range(0, 3)
->execute()
, а нужно строго:
$query->fields(...);
$query->range(...);
$result = $query->execute();
т.е. разделять запросы?

Еще раз спасибо. но хотелось бы уловить ошибку на будущее...

Аватар пользователя drupby drupby 14 октября 2014 в 21:34

"sotkom" wrote:
но хотелось бы уловить ошибку на будущее...

я уже выше писал, смотри документацию методов
leftJoin() возвращает "The unique alias that was assigned for this table." - алиас таблицы
в то время как остальные возвращают "SelectQueryInterface The called object." - SelectQuery объект

public function leftJoin($table, $alias = NULL, $condition = NULL, $arguments = array()) {
  return $this->addJoin('LEFT OUTER', $table, $alias, $condition, $arguments);
}
public function fields($table_alias, array $fields = array()) {

  if ($fields) {
    foreach ($fields as $field) {
      // We don't care what alias was assigned.
      $this->addField($table_alias, $field);
    }
  }
  else {
    // We want all fields from this table.
    $this->tables[$table_alias]['all_fields'] = TRUE;
  }

  return $this;
}

Аватар пользователя sotkom sotkom 14 октября 2014 в 21:31

ладно, к сожалению не "доходит" до меня это объяснение (((
спасибо и на этом, буду экспериментировать, на практике "дойдет"...

Аватар пользователя Orion76 Orion76 14 октября 2014 в 22:00

Вызывайте методы непосредственно от самого объекта..неошибетесь..

<?php
$res 
db_select('node''a');
          
$res->leftJoin('field_data_body''b''b.entity_id=a.nid');
          
$res->fields('a', array('nid''title'));
          
$res->fields('b', array('body_value'));
          
$res->range(03);
          
$res->execute();
?>

И внимательнее читайте документацию, рекомендации и примеры..

Чтобы методы можно было вызывать по цепочке, необходимо чтобы каждый предыдущий возврашал объект, владелец метода..
А join - возвращает алиас таблицы..

Аватар пользователя sotkom sotkom 14 октября 2014 в 22:29

ага, спасибо, более понятно теперь... просто я по разному местами менял вызовы методов, а вот непосредственно из самого объекта их не вызывал... теперь так буду...

Аватар пользователя drupby drupby 14 октября 2014 в 22:30

"sotkom" wrote:
Выводится ошибка: Fatal error: Call to a member function fields() on a non-object

элементарно же в ошибке было указано, что метод fields() был вызван не для объекта, а в данном случае для строки, которую возвратил предыдущий последовательно вызванный метод leftJoin, возвративший алиас приджоиненой таблицы

Аватар пользователя sotkom sotkom 14 октября 2014 в 22:53

)))

"drupby" wrote:
элементарно же в ошибке было указано, что метод fields() был вызван не для объекта, а в данном случае для строки, которую возвратил предыдущий последовательно вызванный метод leftJoin, возвративший алиас приджоиненой таблицы

в ошибке всего то написано что функция вызвана не на объект. остальное уже это твои знания... которых у меня нет в этом вопросе, поэтому и спросил.
orion76 объяснил более понятным мне языком, из которого я уловил для себя что:
надо вызывать методы непосредственно из самого объекта;
порядок вызовов методов имеет значение.
Мне только это и надо было.
Просто перелопатил кучу информации, примеры по-разному написаны, вот и запутался...
Всем спасибо!

Аватар пользователя Orion76 Orion76 14 октября 2014 в 23:14

"sotkom" wrote:
надо вызывать методы непосредственно из самого объекта;
порядок вызовов методов имеет значение.

Не совсем верный вывод..
Ключевой момент вам привели в примере выше:

<?php
return $this;
?>

$this - это,грубо говоря, сам объект, т.е.в нашем случае $res
Если метод объекта возвращает объект-владелец ($this), то следующий метод можно вызывать "по цепочке":

<?php
$res 
db_select('node''a')->leftJoin('field_data_body''b''b.entity_id=a.nid');

// или с новой строки для "красоты"
$res db_select('node''a')
    ->
leftJoin('field_data_body''b''b.entity_id=a.nid');
?>
Аватар пользователя sotkom sotkom 15 октября 2014 в 7:28

"orion76" wrote:
Если метод объекта возвращает объект-владелец ($this), то следующий метод можно вызывать "по цепочке":
<?php
$res = db_select('node', 'a')->leftJoin('field_data_body', 'b', 'b.entity_id=a.nid');

// или с новой строки для "красоты"
$res = db_select('node', 'a')
    ->leftJoin('field_data_body', 'b', 'b.entity_id=a.nid');
?>


так я так и делал, но это не работало, в чем и возникла проблема...
$res = db_select('node', 'a')
->leftJoin('field_data_body', 'b', 'b.entity_id=a.nid')
->fields('a', array('nid', 'title'))
->fields('b', array('body_value'))
->range(0, 3)
->execute();
с чего все и началось.
а когда сделал:
$query = db_select('node', 'a');
$query->leftJoin('field_data_body', 'b', 'b.entity_id=a.nid');
$query->fields('a', array('nid', 'title'));
$query->fields('b', array('body_value'));
$query->range(0, 3);
$result = $query->execute();
все заработало.
Вот я и сделал выводы...