Laravel 4.2. Query Builder
Практическое использование 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