Query Builder — примеры запросов

Комментарии: 7  Просмотры: 41 642

Продолжаем наше знакомство с инструментом Query Builder и его методами. Для объединения таблиц используются методы join() и on(). Допустим у нас в одной таблице хранится список пользователей, а в другой — сообщения этих пользователей. Тогда для получения пяти сообщений с именами пользователей, написавших их, код будет таким:

$query = DB::select('name', 'message')
        ->from('users')
        ->join('messages')
        ->on('users.id', '=', 'messages.id_user')
        ->limit(5);

А запрос, который будет сгенерирован, таким:

SELECT `name`, `message` 
FROM `users` 
JOIN `messages` 
ON (`users`.`id` = `messages`.`id_user`) 
LIMIT 5

Метод join() может принимать второй параметр. Если нам нужен какой-нибудь LEFT JOIN или INNER JOIN, то пишем так:

...
        ->join('table_name', 'LEFT')
...
        ->join('table_name', 'INNER')
...

Агрегатные функции, такие как COUNT(), SUM(), AVG() и другие передаются в качестве элемента массива в методе select(). Очень часто данные функции используются в совокупности с методами group_by() и having() для группировки и фильтрации данных. Допустим, нам нужно вывести список пользователей с количеством сообщений больше девяти:

$query = DB::select('username', array('COUNT("id")', 'total_posts')    
        ->from('posts')
        ->group_by('username')
        ->having('total_posts', '>=', 10);

Запрос, который будет сгенерирован, выглядит следующим образом:

SELECT `username`, COUNT(`id`) AS `total_posts` 
FROM `posts` 
GROUP BY `username` 
HAVING `total_posts` >= 10

Т.е. вы видите, что для создания алиаса в метод select() нужно передать уже массив, где первым элементом будет название поля или агрегатная функция, а вторым — название алиаса. Ну а как работают методы group_by() и having() думаю и так понятно.

Естественно сам сгенерированный запрос — это не совсем то, что нам нужно. Нам важен результат этого запроса. А для его получения нужно использовать уже знакомый метод execute(). Ну и совершенно аналогично указывается тип получаемого результата. Мы можем получить объект:

$result = $query->as_object()->execute();

Или мы можем получить массив:

$result = $query->execute()->as_array();

Теперь несколько примеров того, как в Query Builder происходит работа с запросами INSERT, UPDATE и DELETE.

Так выглядит INSERT:

$query = DB::insert('users', array('login', 'password'))
            ->values(array($login, $password));

Это вставка в таблицу users логина и пароля пользователя:

INSERT INTO `users` (`login`, `password`) 
VALUES ('misha', 123)

Так выглядит UPDATE:

$query = DB::update('users')
        ->set(array('password' => 321))
        ->where('login', '=', 'misha');

Это смена пароля пользователем:

UPDATE `users` 
SET `password` = 321 
WHERE `login` = 'misha'

И, наконец, DELETE. Удалим бедного Мишу:

$query = DB::delete('users')
        ->where('login', '=', 'misha');

Прости, Миша. Ничего личного:

DELETE FROM `users` 
WHERE `login` = 'misha'

Иногда может возникнуть ситуация, когда нам потребуется исполнить часть запроса «как она есть», без срабатывания Query Builder. В таком случае используются так называемые Database Expressions. Пусть мы делаем счетчик статей и нам нужно нарастить значение в поле quantity на единицу при добавлении новой статьи:

$query = DB::update('articles')
        ->set(array('quantity' => DB::expr('quantity + 1')))
        ->where('cat_id', '=', $cat_id);

Получим:

UPDATE `articles` 
SET `quantity` = quantity + 1 
WHERE `cat_id` = 1

А если бы мы не использовали DB::expr, то получили бы такой запрос:

UPDATE `articles` 
SET `quantity` = 'quantity + 1' 
WHERE `cat_id` = 1

Т.е. совершенно не то, что требовалось.
Здесь рассмотрены конечно не все методы Query Builder, но большая их часть. Все методы можно посмотреть в самом модуле Database, тем более, что они разделены на разные файлы с классами и находятся в папке /modules/database/classes/kohana/database/query/builder/.
В следующем уроке мы закрепим наши знания и немножко попрактикуемся, ну а потом потихоньку перейдем к ORM.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 7 коммент.

Вперед >> — ссылка ведёт на эту же страницу))

а, там уже на ORM должно переходить))

Добрый день.
Подскажите как через query builder создать такой запрос:

insert into lessons_users(lessons_id, user_id) values((select id from lessons where title = ‘title’),’123′);

т.е. где значение для вставки (в моем примере — id записи title из таблицы lessons) выбирается условием из другой таблицы.

Спасибо.

Попробуйте так:

$query1 = DB::select('id')->from('lessons')->where('title', '=' ,'title'); 
$query2 = DB::insert('lessons_users', array('lessons_id', 'user_id'))->values(array($query1, 123));

Спасибо. Понял — надо делать вложенные запросы.

Здравствуйте! Есть такой запрос:
SELECT p_name
FROM products, products_features, features, features_values
WHERE products.p_id = products_features.p_id
AND features.f_id = products_features.f_id
AND features_values.fv_id = products_features.fv_id
AND features.f_name = ‘color’
AND f_value = ‘blue’

Помогите ,пожалуйста, правильно сделать этот запрос в кохане;c помощью where, and_where — не получается.

Тут лучше join — ы использовать



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.