Продолжаем наше знакомство с инструментом 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.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Вперед >> — ссылка ведёт на эту же страницу))
а, там уже на ORM должно переходить))
Добрый день.
Подскажите как через query builder создать такой запрос:
insert into lessons_users(lessons_id, user_id) values((select id from lessons where title = ‘title’),’123′);
т.е. где значение для вставки (в моем примере — id записи title из таблицы lessons) выбирается условием из другой таблицы.
Спасибо.
Попробуйте так:
Спасибо. Понял — надо делать вложенные запросы.
Здравствуйте! Есть такой запрос:
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 — ы использовать