Содержание
- Основы
- Получение записей
- Построение Where критериев
- Вложенные Where критерии
- Динамические Where критерии
- Связывание таблиц
- Сортировка результатов
- Ограничения и смещения
- Агрегатирование
- Выражения
- Вставка записей
- Изменение записей
- Удаление записей
Основы
Fluent конструктор запросов является мощным интерфейсом Laravel для построения SQL запросов и работы с базой данных. Все запросы используют подготовленные выражения и защищены от SQL инъекций.
Вы можете начать работать с fluent используя метод table класса DB.
$query = DB::table('users');
Теперь вы подсоединены к базе "users" и можете использовать Fluent. Вы можете запрашивать, вставлять, обновлять, или удалять записи из таблиц.
Запрос записей
Получение массива записей из базы:
$users = DB::table('users')->get();
Примечание: Метод get возвращает массив объектов со свойствами, соотвествующими столбцам базы.
Получение первой записи из базы:
$user = DB::table('users')->first();
Получение записи по ключу:
$user = DB::table('users')->find($id);
Примечание: Если результат не найдется, метод first вернет NULL. Метод get в таких случаях возвращает пустой массив.
Получение значения из одного столбца базы данных:
$email = DB::table('users')->where('id', '=', 1)->only('email');
Выбор только определенных столбцов из базы данных:
$user = DB::table('users')->get(array('id', 'email as user_email'));
Выбор различных результатов из базы данных:
$user = DB::table('users')->distinct()->get();
Построение Where критериев
where и or_where
Есть различные методы, чтобы помочь вам в создании where критериев. Самый основной из этих методов, where и or_where методами. Вот как их использовать:
return DB::table('users')
->where('id', '=', 1)
->or_where('email', '=', 'example@gmail.com')
->first();
Вы, конечно, не ограничитесь только проверкой равенства. Вы можете использовать greater-than, less-than, not-equal, и like:
return DB::table('users')
->where('id', '>', 1)
->or_where('name', 'LIKE', '%Taylor%')
->first();
Подводя итог, where метод добавит в запрос с использованием AND условием, в то время как or_where метод будет использовать OR условие.
where_in, where_not_in, or_where_in, и or_where_not_in
Набор методов where_in позволяет легко строить запросы для получения массива значений:
DB::table('users')->where_in('id', array(1, 2, 3))->get();
DB::table('users')->where_not_in('id', array(1, 2, 3))->get();
DB::table('users')
->where('email', '=', 'example@gmail.com')
->or_where_in('id', array(1, 2, 3))
->get();
DB::table('users')
->where('email', '=', 'example@gmail.com')
->or_where_not_in('id', array(1, 2, 3))
->get();
where_null, where_not_null, or_where_null, и or_where_not_null
Набор where_null методов делает проверку на NULL соответствия:
return DB::table('users')->where_null('updated_at')->get();
return DB::table('users')->where_not_null('updated_at')->get();
return DB::table('users')
->where('email', '=', 'example@gmail.com')
->or_where_null('updated_at')
->get();
return DB::table('users')
->where('email', '=', 'example@gmail.com')
->or_where_not_null('updated_at')
->get();
Вложенные Where критерии
Для группировки вложенных WHERE можнои спользовать анонимную функцию с where или or_where методами:
$users = DB::table('users')
->where('id', '=', 1)
->or_where(function($query)
{
$query->where('age', '>', 25);
$query->where('votes' '>', 100);
})
->get();
Этот пример создает запрос вида:
SELECT * FROM "users" WHERE "id" = ? OR ("age" > ? AND "votes" > ?)
Динамические Where критерии
Динамические методы where - чудесный способ улучшить читабельность кода. Например:
$user = DB::table('users')->where_email('example@gmail.com')->first();
$user = DB::table('users')->where_email_and_password('example@gmail.com', 'secret');
$user = DB::table('users')->where_id_or_name(1, 'Fred');
Связывание таблиц
Используйте join и left_join методы:
DB::table('users')
->join('phone', 'users.id', '=', 'phone.user_id')
->get(array('users.email', 'phone.number'));
Присоединяемая таблица передается в качестве первого параметра. Оставшиеся три параметра используются для построения связывания.
Раз вы знаете, как использовать join, вы знаете как использовать left_join. Сигнатура такая же:
DB::table('users')
->left_join('phone', 'users.id', '=', 'phone.user_id')
->get(array('users.email', 'phone.number'));
Вы можете также определить множественные критерии для ON критериев использованием анонимой функции в качестве второго параметра связывания:
DB::table('users')
->join('phone', function($join)
{
$join->on('users.id', '=', 'phone.user_id');
$join->or_on('users.id', '=', 'phone.contact_id');
})
->get(array('users.email', 'phone.numer'));
Сортировка результатов
Для сортировки используется метод order_by. Применение очень простое:
return DB::table('users')->order_by('email', 'desc')->get();
Вы можете использовать множественную сортировку:
return DB::table('users')
->order_by('email', 'desc')
->order_by('name', 'asc')
->get();
Ограничения и смещения
Для использования LIMIT при ограничении количества записей применяется take метод:
return DB::table('users')->take(10)->get();
Для установки OFFSET запроса используйте skip метод:
return DB::table('users')->skip(10)->get();
Агрегатирование
Требуются MIN, MAX, AVG, SUM, или COUNT значения? Вставьте их в запрос:
$min = DB::table('users')->min('age');
$max = DB::table('users')->max('weight');
$avg = DB::table('users')->avg('salary');
$sum = DB::table('users')->sum('votes');
$count = DB::table('users')->count();
С использованием WHERE:
$count = DB::table('users')->where('id', '>', 10)->count();
Выражения
Иногда вам может потребоваться установить значение столбца в функции SQL, такие как NOW(). Обычно ссылки на NOW(), автоматически обрамляются в кавычки и скрываются. Для предотвращения этого используют метод raw класса DB. Вот как это выглядит:
DB::table('users')->update(array('updated_at' => DB::raw('NOW()')));
Raw метод указывает запросу инжектировать содержимое выражения в запрос в виде строки, а не с заданными параметрами. Например, вы можете использовать выражения для инкрементирования значения столбца:
DB::table('users')->update(array('votes' => DB::raw('votes + 1')));
Удобные методы предлагаются increment и decrement:
DB::table('users')->increment('votes');
DB::table('users')->decrement('votes');
Вставка записей
Insert метод заведует вставкой массива значений. Он возвращает false или true, индицируя успешеность запроса:
DB::table('users')->insert(array('email' => 'example@gmail.com'));
Нужно вставить запись с автоинкрементированием ID? Используйте insert_get_id методы:
$id = DB::table('users')->insert_get_id(array('email' => 'example@gmail.com'));
Примечание: Методы insert_get_id ожидают имя автоинкрементируемого столбца "id".
Изменение записей
Для изменения записи просто передайте массив методу update:
$affected = DB::table('users')->update(array('email' => 'new_email@gmail.com'));
Для изменения нескольких записей добавьте WHERE критерий перед update методом:
$affected = DB::table('users')
->where('id', '=', 1)
->update(array('email' => 'new_email@gmail.com'));
Удаление записей
Для удаления используется delete метод:
$affected = DB::table('users')->where('id', '=', 1)->delete();
Хотите быстро удалить запись по ID? Нет проблем. Вставьте ID в метод delete:
$affected = DB::table('users')->delete(1);