<rmcreative>

RSS

Именованные группы условий в CodeIgniter

10 января 2010

В данный момент я активно использую фреймворк Yii, в котором есть довольно вкусная возможность, позаимствованная из Ruby on Railsименованные группы условий Active Record. Сегодня попробовал сделать то же в CodeIgniter. Всё оказалось очень просто.

Итак, нам необходимо добиться следующего вида контроллера:

class Test extends Controller  {
    function __construct(){
        parent::__construct();
        $this->load->model('post');
    }
 
    function index(){
        // получаем 10 опубликованных заметок, готовых к отображению
        $posts = $this->post->published()->limit(10)->find();
        foreach($posts as $post){
                //
        }
    }
}

Модель в этом случае будет выглядеть так:

<?php
class Post extends Model {
    function __construct(){
        parent::__construct();
        // по умолчанию записи выбираются из таблицы post и сортируются
        // в обратном порядке по времени создания
        $this->db->from('post')->order_by("created_at", "desc");        
    }
 
    // позволяет ограничить количество отдаваемых записей
    function limit($number){
        $this->db->limit($number);
        // возвращаем себя же
        // это делает возможным запись методов цепочкой
        return $this;
    }
 
    // добавляет в запрос условие на выборку только опубликованных записей
    function published(){
        $this->db->where('published', 1);
        return $this;
    }
 
    // возвращает массив записей
    function find(){
        return $this->db->get()->result();        
    }
}

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

  1. №2160
    Костег
    Костег 10 янв. 2010 г., 11:14:01

    А как можно создавать фильтры WHERE "на лету"? Ну, к примеру у нас подбор отеля на основе параметров (звездность - 3 звезды или выше, расположен в регионе с id=40, питание AI или вкуснее).

    $this->db->where('published', 1);

    а есть ли всяческие orwhere, andwhere, как в Кохане?

  2. №2161
    Костег
    Костег 10 янв. 2010 г., 11:15:03

    upd: затупил, or_where есть

    http://codeigniter.com/user_guide/database/active_record.html#select

  3. №2163
    vladname
    vladname 11 янв. 2010 г., 14:26:10

    Великолепно! Давно начал подозревать, что CI не так прост как кажется :)

  4. №2170
    Taral
    Taral 13 янв. 2010 г., 3:19:23

    Ну это вы на стезю ORM идете.

    Кстати в Kohana есть подобная реализация.

    ORM::factory('post')->where('published', '=', 1)->find_all();

    Но поскольку тут речь про codeigniter а в нем нету собственной реализации ORM эта статья очень даже кстати.

    Я часто использую метод filter в который передается саммив значений и по ним осуществляется фильтрация.

    Что-то в таком роде

    $posts = $this->post->filter($_POST)->limit(10)->find();

  5. №6439
    Роман
    Роман 12 июля 2012 г., 2:24:42

    Автору спасибо. А то я уже собрался свою универсальную модель писать (да-да, с обработчиком массивов блэк-джеком и шлюхами).

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.