Может войдёшь?
Черновики Написать статью Профиль

Fluent конструктор запросов

перевод документация 3.x

Содержание

Основы

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);

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.