Kohana3. Прямые запросы к БД

kohana И опять шпаргалка.

Не знаю как кому, но мне иногда не хватает возможностей ORM. Иногда хочется эдакий запрос загнуть, который я ясно представляю в виде SQL, но совершенно не вижу в ORM. Кроме того есть постоянное ощущение, что ORM попутно использует определённые ресурсы. Иногда это критично, иногда нет, но тем не менее стоит знать, как в Kohana3 работать прямыми запросами.

Естественно, нужно помнить, что используя прямые запросы к БД можно нечаянно проглядеть возможность SQL-инъекции.

Пример 1. UPDATE и DELETE
————————————-
Вот высосанный из пальца пример

$query="update `article` SET author=10 WHERE author=20";
DB::query(Database::UPDATE,$query)->execute();

Delete делается абсолютно аналогично

$query="delete `article` WHERE author=20";
DB::query(Database::DELETE,$query)->execute();

Пример 2. Хитрый SELECT
————————————

Иногда бывает такой сложный SELECT, который не сразу поймёшь как написать в ORM?, даже если это вообще возможно.

$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"];

Кстати результаты запроса можно попутно кешировать. Время жизни кеша указывается в секундах

$qresult=DB::query(Database::SELECT,$query)->cached(7200)->execute()->as_array();

Этот кеш хранится в файлах и актуален в контексте всего приложения. Вспомним, что в CI кеш базы данных действовал только в контексте контроллера/функции

В приведённом выше примере результат запроса имеет только одну запись. Если результат содержит много записей можно закрутить цикл, как для ORM.

$query="SELECT blablabla …..крутой запрос...            ";

$myresult_rows=DB::query(Database::SELECT,$query)->execute()->as_array();
foreach ($myresult_rows as $myresult_row){
// делаем что хотим
}

Вопрос в зал
————————-
Кто знает как такие задачи эффективно решить на ORM? На любом, необязательно штатном Kohana3, можно Jelly, Sprig, Doctrina.
Отзовитесь.

Kohana3. Прямые запросы к БД: 2 комментария

  1. Chodex

    ORM не панацея от всего. Зачем усложнять и утяжелять приложение, если в этом нет смысла.
    Я предпочитаю реализовывать сложную логику через Query Builder.

  2. biakaveron

    Такие вещи через ORM надо решать созданием отдельных методов, внутри которых юзать QBuilder. Только не прямые запросы :)

Комментарии запрещены.