Основы ORM — Получение записей

Комментарии: 14  Просмотры: 41 154

Продолжаем знакомство с 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
{
    // Страница с ошибкой. Можно выдавать стандартную "Такой страницы не существует".
}

Я крайне рекомендую эту проверку всегда производить. В следующих уроках мы будем рассматривать изменение данных в базе посредством текущего объекта. И может так случится, что вместо апдейта записи у нас будет создаваться новая пустая запись. Я уже один раз наступил на эти грабли.
Вот собственно и все. Успехов и удачи.

<< Назад | Вперед >> | Обсудить на форуме

Алмазная резка проёмов еще здесь. | top casino online bonus

К записи оставлено 14 коммент.

Эх, раньше бы этот урок, не пришлось бы ломать глаза и язык, читать на инлгише! :)

Всё супер

Кстати хотел спросить по поводу метода 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->as_array())
{
   echo $user['username'];
}

будет работать

foreach ($users as $user)
{
$user = $user->as_array();
echo $user['username'] . »;
}
скорее так

А как на счёт использования представлений (View)? Почему вывод прямо в модели?

Вы про что ? Про это ?

$articles = ORM::factory('article')->find_all();
 
foreach($articles as $article)
{
    echo $article->name .'<br />';
}

Во-первых, это не в модели, а в контроллере. Во-вторых, перебор массива в представлении и производится. В данном случае это просто пример.

Подскажи пожалуйста как сделать одну вещицу…Я пытаюсь в виджете выбрать из базы данные и отправляю их в вид, а потом этот виджет подключить в базовом контроллере, НО получаю ошибку…вытаскиваю весь код из виджета и вставляю напрямую в контроллере- ВСЕ НОРМ. может где статья есть про это???

Вопрос к Автору и к остальным.
Я единственный заметил что есть ошибка в строчке:
$article = $article->find_all();

Как по мне должно быть
$articles = $article->find_all();

Верно, поправил. Спасибо. Возможно не обратили внимание, потому что дальше (где перебор идет в цикле), там все правильно.

а подготовительные запросы в орм есть ??



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.