Запрос к базе данных в Kohana показывает только SQL, а не результирующие строки

#php #kohana #kohana-3 #kohana-db

#php #kohana #kohana-3 #kohana-db

Вопрос:

Я только начал использовать фреймворк Kohana и пытаюсь выполнить несколько запросов, но, потратив пару часов на документацию и запустив несколько тестов, все, что у меня есть, это:

 class Controller_Test extends Controller {
    public function action_index()
    {
       $query = DB::select()->from('test')->where('test', '=', '1');
       echo $query  
    }
}
  

Теперь, если попытаться запустить это, все, что он делает, это повторяет мой SQL.

Как мне получить фактические данные из моей базы данных? Я знаю, что я мог бы сделать что-то вроде:

 $row = mysql_fetch_row(mysql_query($query));
echo $row[0];
  

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

Комментарии:

1. кстати, вам пригодится отличная официальная документация о DB-модуле в ko3: kohanaframework.org/3.0/guide/database

Ответ №1:

Вы должны знать, что на самом деле вы создаете объект Database_Query, поэтому в конце должно быть что-то, что его выполнит, верно?

$results = DB::select('*')->from('table')->execute();

и затем вы можете обычно перебирать эти:

foreach ($results as $result) { echo $result->id; }

Комментарии:

1. Я пытался запустить ваш код, но получаю эту ошибку ErrorException [ Уведомление]: Попытка получить свойство не-объекта

Ответ №2:

После того, как вы создали запрос, вам нужно будет преобразовать его в Database_Query объект, используя execute() метод, чтобы вы могли получать значения для выполнения.

Если вы хотите обрабатывать результаты запроса в виде массива, вы можете добавить as_array() метод после выполнения следующим образом:

 $query = DB::select()->from('test')->where('test', '=', '1')
                     ->execute()->as_array();
  

Если вы имеете дело только с одной строкой, и вы знаете, что вам нужна только одна строка, вы можете изменить это на current() :

 $query = DB::select()->from('test')->where('test', '=', '1')
                     ->execute()->current();
  

Затем вы можете извлекать по мере необходимости, когда вы перебираете массив:

 foreach ($query as $row)
{
    echo $row['title'];
}
  

Комментарии:

1. Кроме того, если вы используете Database_Query::as_object() перед Database_Query::execute(), Database_Result::current() вернет объект вместо массива, а Database::as_array() вернет массив объектов.

Ответ №3:

Чтобы получить строку:

 $query = DB::select('p.id')
            ->select_array(array('p.title', array('p.title', 'pocket') ))
            ->from(array($this->_table_name, 'p'))
            ->limit(1);

echo $query->execute()->get('id');
  

Чтобы показать запрос:

 echo $query->compile();