## Содержание
- [Основы](#the-basics)
- [Получение записей](#get)
- [Построение Where критериев](#where)
- [Вложенные Where критерии](#nested-where)
- [Динамические Where критерии](#dynamic)
- [Связывание таблиц](#joins)
- [Сортировка результатов](#ordering)
- [Ограничения и смещения](#limit)
- [Агрегатирование](#aggregates)
- [Выражения](#expressions)
- [Вставка записей](#insert)
- [Изменение записей](#update)
- [Удаление записей](#delete)
## Основы
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);