Yii, построитель запроса
17 ноября 2010
Сегодня в SVN Yii появилась ещё одна интересная возможность. Построитель запросов. Тем, кто работал с CodeIgniter, он должен быть хорошо знаком (там он почему-то называется ActiveRecord).
Итак, теперь, если вы не хотите использовать ActiveRecord, запросы можно строить динамически:
$user = Yii::app()->db->createCommand() ->select('username, password') ->from('tbl_user') ->where('id=:id', array(':id'=>1)) ->queryRow();
Комментарии RSS по email OK
Супер. Действительно после долгой работы с CI остаются пристрастия
Действительно, это было удобно в CI, хотя в yii можно это можно реализовать через Criteria
А чего бы Доктрину не прикрутить?
Хорошая идея! Теперь запросы будут записаны в более понятной форме!
none, зачем? AR в Yii удобней и быстрее. Как выйдет вторая, можно будет поиздеваться, а пока уж точно нет смысла.
Ну всё и здесь будут толкать модель в контроллер. Query builder это лишь дополнение к AR, которое даёт возможность обходить сложности и костыли появляющиеся после перехода от sql к объектам.
Метод createCommand() смело можно убирать из цепочки, он только сложности добавляет. Подстановка же параметров, например, в условиях where в Zend сделана удобнее. В итоге yii пока отстает.
удобно, конечно :)
->where('id=:id', array(':id'=>1))
это ужасно.
Чем ужасно?
Ужасно дико это печатать, пожалейте кодеров. Конечно php "костноязычен" достаточно, так зачем же ещё усугублять.
Спасибо за хорошую новость, Criteria меня не очень устраивает по структуре, а здесь всё удобно и хорошо! :)
Alexander, а как по вашему было бы удобней? (На PHP)
Как удобней запросы делать? Мне нравится Active Record + criteria.
Ребят извини за тупость а как быть с OR или AND?
Доудмался))) where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2))
построитель работает только разом? в CI его можно было разбросать кусками по листингу и только в конце выполнить. например, $user->select(...) далее условие if (что-то) $user->where(1=1) else $user->where(2=2). в yii так не работает, увы
Не, не только разом. Работает всё:
интересно. если запрос разом $command = Yii::app()->db->...->queryAll() то работает сразу foreach $command as $c... а если запрос собран частями то работает только через присваивание $c=$command->queryAll() и уже далее foreach... это так задумано?
Да.
foreach
мы делаем для того, что возвращаетqueryAll
, а не для самой команды.Ну и костыль же сделали... я конечно не скажу за OR или Criteria ( я их не видел ). Но вот АР в ЦИ на много легче читать и писать чем тут... ппц просто where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2)) что бы я столько кода писал ! и еще так тупо как-то... В ЦИ все просто or_WHERE(array) или WHERE(array), нравится писать разные там query ? используй метод query().
Я +1 - это изврат!
согласен, в ЦИ запрос собирать интереснее. можно даже не соблюдать последовательность операторов - он сам построит как надо
такая последовательность where не работает?
sers, работает, но
is_active
перетрётсяis_person
.У меня не работает такая конструкция ->where('id=:id1', array(':id1'=>1))
->text тупо выдает SELECT * FROM
table_name
WHERE id=:id1и вообще заметил что ну не заменяются :id
Они и не должны. Они передаются как параметры prepared statement.
по идее целостный (рабочий) код? и в результате $user будет содержать выборку... или я что-то опять не так понял? и $user будет у нас как "ссылка" на запрос, а сам запрос будет выполнен потом? сори пока нет времени лезть глубоко в код - время сегодня ночью занято, на ТЗ проекта. освобожусь обязательно гляну но хотя бы логику процесса хотелось бы услышать. спасибо