Именованные группы условий в 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){ // … } } }
Модель в этом случае будет выглядеть так:
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 по email OK
А как можно создавать фильтры WHERE "на лету"? Ну, к примеру у нас подбор отеля на основе параметров (звездность - 3 звезды или выше, расположен в регионе с id=40, питание AI или вкуснее).
а есть ли всяческие orwhere, andwhere, как в Кохане?
upd: затупил, or_where есть
http://codeigniter.com/user_guide/database/active_record.html#select
Великолепно! Давно начал подозревать, что CI не так прост как кажется :)
Ну это вы на стезю ORM идете.
Кстати в Kohana есть подобная реализация.
ORM::factory('post')->where('published', '=', 1)->find_all();
Но поскольку тут речь про codeigniter а в нем нету собственной реализации ORM эта статья очень даже кстати.
Я часто использую метод filter в который передается саммив значений и по ним осуществляется фильтрация.
Что-то в таком роде
$posts = $this->post->filter($_POST)->limit(10)->find();
Автору спасибо. А то я уже собрался свою универсальную модель писать (да-да, с
обработчиком массивовблэк-джеком и шлюхами).