Laravel 4.2. Query Builder

Категория: Laravel

Практическое использование Eloquent Query Builder в Laravel 4.

Официальная документация: http://laravel.com/docs/queries

Получение PDO объекта

Получить нативный PDO объект:

$pdo = DB::getPdo();

Формат данных

Перед получением данных вы можете задать желаемый формат результирующих данных с помощью метода DB::setFetchMode():

DB::setFetchMode(PDO::FETCH_ASSOC);  // получить массивs записей
DB::setFetchMode(PDO::FETCH_COLUMN); // получить массив значений из первой колонки
Примечание

Метод DB::setFetchMode устанавливает способ форматирования результата для текущего соединения. Т.е. все последующие SELECT запросы будут возвращать ответ в заданном вами формате. Так что, после изменения дефолтного способа форматирования результата, будет хорошей практикой устанавливать обратно дефолтный способ форматирования:


Также вы можете группировать параметры (значение первой колонки будет в качестве ключа, остальные поля будут вложены как ключи массива):

DB::setFetchMode(PDO::FETCH_GROUP|PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE);
Ограничения

Вы не можете указывать комбинацию параметров, для которых (в случае использования PDO) нужно указывать доп параметр - номер колонки - вы получите исключение:

$stmt->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_UNIQUE, 3);

Получение данных

Поучить записи таблицы

Получить данные как вложенные ассоциативные массивы:

DB::setFetchMode(PDO::FETCH_ASSOC);
$rows = DB::table('table')->get();

Изменить дефолтную схему извлечения записей:

Config::set('database.fetch', PDO::FETCH_ASSOC);

Фильтрация

DB::table('table_name')
  ->whereNull('column')
  ->whereNotNull('column')
  ->orWhere(function($query) use ($outerVariable) {
    if ($outerVariable) {
      $query->where('column', '>', $outerVariable);
    }
  });
Примечание

Доступные операторы сравнения:

protected $operators = [
  '=', '<', '>', '<=', '>=', '<>', '!=',
  'like', 'like binary', 'not like', 'between', 'ilike',
  '&', '|', '^', '<<', '>>',
  'rlike', 'regexp', 'not regexp',
  '~', '~*', '!~', '!~*', 'similar to',
  'not similar to', 'not ilike', '~~*', '!~~*',
];

Фильтрация по полям связанной таблицы (получить пользователей у которых есть заказы):

$users = DB::table('users')->whereExists(function($query) {
  $query->select(DB::raw(1))->from('orders')->whereRaw('orders.user_id = user.id');
})->get();
SELECT * FROM users WHERE EXISTS (
  SELECT 1 FROM orders WHERE orders.user_id = users.id
)

Ограничение выборки

Добавление ограничений limit, offset:

$rows = DB::table('table')->skip(110)->take(20)->get();

Колонки

Получить колонку определенную колонку со всего результата:

# Пример получения всех PostgreSQL таблиц из БД
$tables = DB::table('information_schema.tables')
            ->where('table_schema', 'public')
            ->where('table_type', 'BASE TABLE')
            ->lists('table_name');

Получить значение поля первой записи:

$value = DB::table('table')->where('column', 'value')->pluck('column_name');

Уникальные значения колонки:

$allPossibleValues = \DB::table('phones')->distinct()->pluck('vendor');

Вставка записей

Вставить данные и получить last_insert_id:

DB::table('users')->insert($data);
$object = DB::table('users')->find(DB::getPdo()->lastInsertId());

Вставить данные и получить ID этой записи:

$id = DB::table('table')->insertGetId([
  'column1' => 'value',
  'column2' => 1
]);

Массовая (пакетная) вставка записей:

DB::table('table')->insert($collection->toArray());

JOIN

JOIN с дополнительным условием:

$users = DB::table(DB::raw('user u'))
    ->leftJoin(DB::raw('user_group ug'), function(\Illuminate\Database\Query\JoinClause $join) {
        $join->on('u.id', '=', 'ug.user_id')->where('ug.created_at', '>', 2014);
    })
    ->select('u.id', 'u.name', 'ug.updated_at', DB::raw('(ug.id > 0) as is_checked'))
    ->get();

Прочее

Получить значение колонки первой записи (проверим наличие FK (constraints) в PostgreSQL):

$fkExists = DB::table('pg_constraint')
  ->select([DB::raw('1')])
  ->where('conname', 'some_foreign_name')
  ->pluck(1);

#query builder, #laravel 4, #database, #batch insert, #mass insert, #fetch

категория: Laravel