доброго времени суток.
подскажите, пожалуйста, в чем может быть проблема.
Создал простейший модуль.
Написал функцию выборки из бд:
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
Подскажите, плз, в чем проблема?
Комментарии
в игнорировании документации
прочти leftJoin() и к примеру fields()
прежде чем делать последовательный вызов методов, как минимум узнай, что каждый из них возвращает
ну а конкретно можешь указать на ошибки?
или покажи как правильно составить на 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
?
$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();
спасибо, это работает!
так а причина то в чем?
в порядке следования запросов?
или вот так писать нельзя:
->fields('a', array('nid', 'title'))
->range(0, 3)
->execute()
, а нужно строго:
$query->fields(...);
$query->range(...);
$result = $query->execute();
т.е. разделять запросы?
Еще раз спасибо. но хотелось бы уловить ошибку на будущее...
я уже выше писал, смотри документацию методов
leftJoin() возвращает "The unique alias that was assigned for this table." - алиас таблицы
в то время как остальные возвращают "SelectQueryInterface The called object." - SelectQuery объект
return $this->addJoin('LEFT OUTER', $table, $alias, $condition, $arguments);
}
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;
}
ладно, к сожалению не "доходит" до меня это объяснение (((
спасибо и на этом, буду экспериментировать, на практике "дойдет"...
Вызывайте методы непосредственно от самого объекта..неошибетесь..
<?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(0, 3);
$res->execute();
?>
И внимательнее читайте документацию, рекомендации и примеры..
Чтобы методы можно было вызывать по цепочке, необходимо чтобы каждый предыдущий возврашал объект, владелец метода..
А join - возвращает алиас таблицы..
ага, спасибо, более понятно теперь... просто я по разному местами менял вызовы методов, а вот непосредственно из самого объекта их не вызывал... теперь так буду...
элементарно же в ошибке было указано, что метод fields() был вызван не для объекта, а в данном случае для строки, которую возвратил предыдущий последовательно вызванный метод leftJoin, возвративший алиас приджоиненой таблицы
)))
в ошибке всего то написано что функция вызвана не на объект. остальное уже это твои знания... которых у меня нет в этом вопросе, поэтому и спросил.
orion76 объяснил более понятным мне языком, из которого я уловил для себя что:
надо вызывать методы непосредственно из самого объекта;
порядок вызовов методов имеет значение.
Мне только это и надо было.
Просто перелопатил кучу информации, примеры по-разному написаны, вот и запутался...
Всем спасибо!
Не совсем верный вывод..
Ключевой момент вам привели в примере выше:
<?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');
?>
так я так и делал, но это не работало, в чем и возникла проблема...
$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();
все заработало.
Вот я и сделал выводы...