И опять шпаргалка.
Не знаю как кому, но мне иногда не хватает возможностей ORM. Иногда хочется эдакий запрос загнуть, который я ясно представляю в виде SQL, но совершенно не вижу в ORM. Кроме того есть постоянное ощущение, что ORM попутно использует определённые ресурсы. Иногда это критично, иногда нет, но тем не менее стоит знать, как в Kohana3 работать прямыми запросами.
Естественно, нужно помнить, что используя прямые запросы к БД можно нечаянно проглядеть возможность SQL-инъекции.
Пример 1. UPDATE и DELETE
————————————-
Вот высосанный из пальца пример
1 2 | $query="update `article` SET author=10 WHERE author=20"; DB::query(Database::UPDATE,$query)->execute(); |
Delete делается абсолютно аналогично
1 2 | $query="delete `article` WHERE author=20"; DB::query(Database::DELETE,$query)->execute(); |
Пример 2. Хитрый SELECT
————————————
Иногда бывает такой сложный SELECT, который не сразу поймёшь как написать в ORM?, даже если это вообще возможно.
1 2 3 4 5 6 7 8 9 10 | $query="SELECT count( * ) as count, sum( `field1` ) as sum1, count( DISTINCT field2 ) count2, sum( `field3` - `field4` ) as sum2 FROM `table` WHERE field5"; $qresult=DB::query(Database::SELECT,$query)->execute()->as_array(); echo $qresult[0]["count"]; echo $qresult[0]["count2"]; echo $qresult[0]["sum"]; echo $qresult[0]["sum2"]; |
Кстати результаты запроса можно попутно кешировать. Время жизни кеша указывается в секундах
1 | $qresult=DB::query(Database::SELECT,$query)->cached(7200)->execute()->as_array(); |
Этот кеш хранится в файлах и актуален в контексте всего приложения. Вспомним, что в CI кеш базы данных действовал только в контексте контроллера/функции
В приведённом выше примере результат запроса имеет только одну запись. Если результат содержит много записей можно закрутить цикл, как для ORM.
1 2 3 4 5 6 | $query="SELECT blablabla …..крутой запрос... "; $myresult_rows=DB::query(Database::SELECT,$query)->execute()->as_array(); foreach ($myresult_rows as $myresult_row){ // делаем что хотим } |
Вопрос в зал
————————-
Кто знает как такие задачи эффективно решить на ORM? На любом, необязательно штатном Kohana3, можно Jelly, Sprig, Doctrina.
Отзовитесь.
Посты по теме:
RSS-подписка
ORM не панацея от всего. Зачем усложнять и утяжелять приложение, если в этом нет смысла.
Я предпочитаю реализовывать сложную логику через Query Builder.
Такие вещи через ORM надо решать созданием отдельных методов, внутри которых юзать QBuilder. Только не прямые запросы