Продолжаем знакомство с ORM. В прошлом уроке я рассказал, как создавать простейшие модели, используя модуль ORM. В этом уроке речь пойдет уже о работе с базой данных посредством этих моделей. Пусть у нас есть модель, которая работает с таблицей статей и называется она Model_Article. Создание объекта класса Model_Article делается тем же способом, который мы изучили в уроке Создаем первую модель. То есть это будет так:
$article = new Model_Article;
Но предпочтительнее создавать объект следующим образом:
$articles = ORM::factory('article');
Это позволяет записывать вызов методов класса в этой же строчке. Данный способ опять же аналогичен рассмотренному ранее, только обратите внимание, что Model::factory заменено на ORM::factory. Теперь, чтобы получить все записи из таблицы Articles, нам достаточно дописать:
$articles = $article->find_all();
Ну или сразу так:
$articles = ORM::factory('article')->find_all();
После чего в цикле перебираются найденные значения и выводяться нужные. Данный код выведет нам названия всех статей:
$articles = ORM::factory('article')->find_all(); foreach($articles as $article) { echo $article->name .'<br />'; }
Если же нужно получить не все записи, а только одну,то достаточно метод find_all() заменить методом find(). Код:
$article = ORM::factory('article')->find();
Вернет нам только первую запись. Но это редко требуется. Обычно нужно найти запись по идентификатору. Это делается очень просто. Получаем статью с id, который равен 3:
$article = ORM::factory('article', 3); // Или $article = new Model_Article(3);
Как видите, здесь метод find() уже не понадобился. Полученный объект можно преобразовать в массив:
$article = ORM::factory('article', 3)->as_array();
Если необходимо использовать несколько условий where, их можно передать конструктору или методу в виде массива.
$array = array('cat_id' => 3, 'show' => 1); $article = ORM::factory('article', $array);
В этом случае все условия будут связаны посредством AND WHERE. Если же нам нужно использовать, например, условие OR WHERE или такая форма записи не нравится, можно опять использовать метод find() и тогда код станет таким:
$article = ORM::factory('article')->where('cat_id', '=', 3)->or_where('show', '=', 1)->find(); // Получим объект $article = ORM::factory('article')->where('cat_id', '=', 3)->or_where('show', '=', 1)->find()->as_array(); // Получим массив
Самые внимательные в этом месте скажут, да это же Query-builder. Действительно, для формирования как условий, так и всяческих сортировок можно использовать уже знакомые нам методы.
Например, такие:
$articles = ORM::factory('$article') ->where('id', '=', 3) ->or_where('show', '=', 1) ->limit(10) ->order_by('date', 'DESC') ->find_all();
Как вы могли заметить, метод find() используется, когда нужно получить только одну запись. При отсутствии условий это будет первая запись. С условием — первая запись, удовлетворяющая ему. Метод find_all() используется для получения нескольких записей при наличии условий или всех записей, при отсутствии условий. Эти записи можно выводить с помощью перебора данных в цикле.
В случае, если никаких записей согласно условиям не нашлось, нам будет возвращен пустой объект. Объект проверяется с помощью метода loaded следующим образом:
$article = ORM::factory('article') ->where('cat_id', '=', 3) ->or_where('show' => 1) ->find(); if($article->loaded()) { // Производим какие-то действия с объектом } else { // Страница с ошибкой. Можно выдавать стандартную "Такой страницы не существует". }
Я крайне рекомендую эту проверку всегда производить. В следующих уроках мы будем рассматривать изменение данных в базе посредством текущего объекта. И может так случится, что вместо апдейта записи у нас будет создаваться новая пустая запись. Я уже один раз наступил на эти грабли.
Вот собственно и все. Успехов и удачи.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Эх, раньше бы этот урок, не пришлось бы ломать глаза и язык, читать на инлгише!
Всё супер
Кстати хотел спросить по поводу метода as_array(). Он работает только при получении одной записи. Для нескольких записей я так и не смог его завести.
Я делал as_array уже потом, в цикле для всех найденных. Его ведь когда угодно можно применить.
А ведь действительно. При переборе в цикле мы ведь как раз и получаем объекты с одной записьюю
Что-то я затупил. Просто не пользовался этим, но вдруг кому пригодится.
а что заводить то
$users = ORM::factory(‘user’)->find_all()->as_array();
foreach ($users as $user)
{
echo $user->username . »;
}
// or
echo $users[0]->username . »;
echo $users[1]->username;
Речь шла сразу про $article['name'] как в варианте с find.
Я так понимаю, что
будет работать
foreach ($users as $user)
{
$user = $user->as_array();
echo $user['username'] . »;
}
скорее так
согласен
А как на счёт использования представлений (View)? Почему вывод прямо в модели?
Вы про что ? Про это ?
Во-первых, это не в модели, а в контроллере. Во-вторых, перебор массива в представлении и производится. В данном случае это просто пример.
Подскажи пожалуйста как сделать одну вещицу…Я пытаюсь в виджете выбрать из базы данные и отправляю их в вид, а потом этот виджет подключить в базовом контроллере, НО получаю ошибку…вытаскиваю весь код из виджета и вставляю напрямую в контроллере- ВСЕ НОРМ. может где статья есть про это???
Вопрос к Автору и к остальным.
Я единственный заметил что есть ошибка в строчке:
$article = $article->find_all();
Как по мне должно быть
$articles = $article->find_all();
Верно, поправил. Спасибо. Возможно не обратили внимание, потому что дальше (где перебор идет в цикле), там все правильно.
а подготовительные запросы в орм есть ??