Выдано 110568 лицензий

Построитель запросов QueryBuilder

QueryBuilder реализует Database Abstraction Layer (DBAL) для следующий операторов: Select, Insert, Update, Delete, Rename, Drop, Truncate, Lock.

Использование QueryBuilder возможно как отдельно для выполнения соответствующих запросов, так и совместно с ORM.

Совместная работа ORM и QueryBuilder

Объект ORM имеет метод ->queryBuilder(), через который можно добавить дополнительные условия выборки у объекта или связи.

$oBook = Core_Entity::factory('Book');
$oBook->queryBuilder()
   ->where('value', '=', 99);
$aBooks = $oBook->findAll();

Дополнительные условия для связи.

$oComments = Core_Entity::factory('Book')->Comments;
$oComments->queryBuilder()
	->where('active', '=', 1);
$aComments = $oComments->findAll();

Примеры работы

Получение массива всех найденных элементов

$oCore_QueryBuilder_Select = Core_QueryBuilder::select()
   ->from('structures')
   ->where('column1', '=', 1);
$aRows = $oCore_QueryBuilder_Select->execute()->asAssoc()->result();

Получение одного найденного элемента

$oCore_QueryBuilder_Select = Core_QueryBuilder::select()
   ->from('structures')
   ->where('column1', '=', 1)
   ->limit(1);
$row = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();

Ограничения выбираемых столбцов

Вариант 1:

$oCore_QueryBuilder_Select = Core_QueryBuilder::select('id', 'name', 'description')
   ->from('structures');

Вариант 2:

$oCore_QueryBuilder_Select = Core_QueryBuilder::select()
   ->select('id')
   ->select('name')
   ->select('description')
   ->from('structures');

Использование псевдонимов

Вариант 1:

$oCore_QueryBuilder_Select = Core_QueryBuilder::select('id', array('name', 'newname'), array('description', 'newdescription'))
   ->from('structures');

Вариант 2:

$oCore_QueryBuilder_Select = Core_QueryBuilder::select()
   ->select('id')
   // `name` AS `newname`
   ->select(array('name', 'newname'))
   // `description` AS `newdescription`
   ->select(array('description', 'newdescription'))
   ->from('structures');

Скалярный подзапрос

http://dev.mysql.com/doc/refman/5.5/en/scalar-subqueries.html

// SELECT (SELECT MAX(`column2`) FROM `t2`) FROM `t1`
$oCore_QueryBuilder_Select2 = Core_QueryBuilder::select('MAX(column2)')->from('t2');
$oCore_QueryBuilder_Select = Core_QueryBuilder::select($oCore_QueryBuilder_Select2)->from('t1');

Сравнение с использованием подзапроса

http://dev.mysql.com/doc/refman/5.5/en/comparisons-using-subqueries.html

// SELECT FROM `t1` WHERE `column1` = (SELECT MAX(`column2`) FROM `t2`)
$oCore_QueryBuilder_Select2 = Core_QueryBuilder::select('MAX(column2)')->from('t2');

$oCore_QueryBuilder_Select = Core_QueryBuilder::select()->from('t1')
   ->where('column1', '=', $oCore_QueryBuilder_Select2);

INNER JOIN

Полное объединение в случае, если в обеих таблицах столбец имеет одинаковое наименование.

// INNER JOIN `join1` USING (`join_field`)
$Core_QueryBuilder_Select->join('join1', 'join_field');

Полное объединение в случае, если в таблицах столбцы имеют различные наименования.

// INNER JOIN `jointable`.`join1` ON `join_field` = `join_field2`
$Core_QueryBuilder_Select->join('jointable.join1', 'join_field1', '=', 'join_field2');

Полное объединение с дополнительными условиями.

// INNER JOIN `jointable`.`join1` ON `join_field` = `join_field2` AND `A` = '123' AND `B` = 'xyz'
$Core_QueryBuilder_Select->join('jointable.join1', 'join_field1', '=', 'join_field2', array(
		array('AND' => array('A', '=', '123')),
		array('AND' => array('B', '=', 'xyz'))
	));

LEFT OUTER JOIN

Левое внешнее объединение в случае, если в обеих таблицах столбец имеет одинаковое наименование.

// LEFT OUTER JOIN `join1` USING (`join_field2`)
$Core_QueryBuilder_Select->leftJoin('join1', 'join_field2');

Левое внешнее объединение в случае, если в таблицах столбцы имеют различные наименования.

// LEFT OUTER JOIN `jointable`.`join1` ON `join_field` = `join_field2`
$Core_QueryBuilder_Select->leftJoin('jointable.join1', 'join_field', '=', 'join_field2');

RIGHT OUTER JOIN

Правое внешнее объединение в случае, если в обеих таблицах столбец имеет одинаковое наименование.

// RIGHT OUTER JOIN `join1` USING (`join_field2`)
$Core_QueryBuilder_Select->rightJoin('join1', 'join_field2');

Правое внешнее объединение в случае, если в таблицах столбцы имеют различные наименования.

// RIGHT OUTER JOIN `jointable`.`join1` ON `join_field` = `join_field2`
$Core_QueryBuilder_Select->rightJoin('jointable.join1', 'join_field', '=', 'join_field2');

ORDER BY

Сортировка задаются методом orderBy(), для удаления предыдущих установок сортировки используется clearOrderBy()

Сортировка по одному полю:

$Core_QueryBuilder_Select
	->clearOrderBy()
	->orderBy('id', 'ASC');

Сортировка по двум полям:

$Core_QueryBuilder_Select
	->clearOrderBy()
	->orderBy('name', 'ASC')
	->orderBy('sorting', 'DESC');

Случайная сортировка:

$Core_QueryBuilder_Select
	->clearOrderBy()
	->orderBy('RAND()');

HAVING

// HAVING `a1` > '2'
$Core_QueryBuilder_Select->having('a1', '>', '2');
// HAVING `f5` IS TRUE
$Core_QueryBuilder_Select->having('f5', 'IS', TRUE);
// HAVING `a4` IN (17, 19, NULL, 'NULL')
$Core_QueryBuilder_Select->having('a4', 'IN', array(17,19, NULL, 'NULL'));
// HAVING `a7` BETWEEN 1 AND 10
$Core_QueryBuilder_Select->having('a7', 'BETWEEN', array(1, 10));

Сложные условия выборки

$oCore_QueryBuilder_Select = Core_QueryBuilder::select(
	array('id', 'newid'), array('name', 'newname'), 'description'
)
   ->from('structures')
	->open()
		->where('url', 'LIKE', '%xyz%')
		->setOr()
		->where('type', '=', 0)
	->close()
	->where('sorting', '>', 10)
	->havingOpen()
		->having('newid', '>', 123)
		->setOr()
		->having('newname', 'LIKE', '%asd%')
	->havingClose()
	->offset(10)
	->limit(5);

Сложные выражения

Указать вычисляемые поля или условия выборки можно с использованием Core_QueryBuilder::expression, например:

->select(array(Core_QueryBuilder::expression('COUNT(DISTINCT `tablename`.`id`)'), 'count'))
->where('tablename1.field1', '=', Core_QueryBuilder::expression('tablename2.field1'))
->orderBy(Core_QueryBuilder::expression('IF ( `min_weight` > 0 AND `max_weight` > 0 AND  `min_price` > 0 AND `max_price` > 0, 1, 0)'), 'DESC')

GROUP BY

// GROUP BY `field`, COUNT(`id`)
$Core_QueryBuilder_Select->groupBy('field1')->groupBy('COUNT(id)');

UNION

Объединение используется для комбинации результатов нескольких запросов на выборку.

// (SELECT `id2`, `name2` FROM `tablename2`)
// UNION
// (SELECT `id`, `name` FROM `tablename` LIMIT 10 OFFSET 0)
$select1 = Core_QueryBuilder::select('id', 'name')->from('tablename')
	->limit(0, 10);

$select2 = Core_QueryBuilder::select('id2', 'name2')->from('tablename2')
	->union($select1);

Вставка

Первый вариант

$oCore_QueryBuilder_Insert = Core_QueryBuilder::insert('tableName')
   ->columns('column1', 'column2', 'column3')
   ->values('value1', 'value2', 11)
   ->values('value3', 'value4', 17)
   ->values('value5', 'value6', 19)
   ->execute();

Второй вариант

$oCore_QueryBuilder_Insert = Core_QueryBuilder::insert('tableName', array('column1' => 'value1', 'column2' => 'value2'))
   ->execute();

Обновление

// UPDATE `tableName` SET `column1` = 'value', `column2` = 'value2'
// WHERE `column` != '5' AND `a4` IN (17, 19, NULL) ORDER BY `column2` ASC LIMIT 10
$update = Core_QueryBuilder::update('tableName')
   ->columns(array('column1' => 'value', 'column2' => 'value2'))
   ->where('column', '!=', '5')
   ->where('a4', 'IN', array(17,19, NULL))
   ->orderBy('column2')
   ->limit(10)
   ->execute();
// UPDATE `tableName` SET `column1` = 'value', `column2` = 'value2' WHERE `column` = '5'
$oCore_QueryBuilder_Update = Core_QueryBuilder::update('tableName')
    ->set('column1', 'value')
    ->set('column2', 'value2')
   ->where('column', '=', '5')
   ->execute();

Удаление записи

// DELETE LOW_PRIORITY QUICK IGNORE FROM `tableName`
// WHERE `column1` = '17' AND `column2` != '19'
// ORDER BY `field1` DESC LIMIT 10
$delete = Core_QueryBuilder::delete('tableName')
      ->lowPriority()
      ->quick()
      ->ignore()
      ->where('column1', '=', '17')
      ->where('column2', '!=', '19')
      ->orderBy('field1', 'DESC')
      ->limit(10)
      ->execute();

Переименование таблиц

$oCore_QueryBuilder_Rename = Core_QueryBuilder::rename('oldTableName1', 'newTableName1')
   ->execute();

Переименование нескольких таблиц

// Rename multiple tables
$oCore_QueryBuilder_Rename = Core_QueryBuilder::rename('oldTableName1', 'newTableName1')
   ->table('oldTableName2', 'newTableName2')
   ->execute();

Удаление таблицы

// Drop multiple tables
$oCore_QueryBuilder_Drop = Core_QueryBuilder::drop('TableName1')
   ->table('TableName2')
   ->execute();

Очистка таблицы

$oCore_QueryBuilder_Truncate = Core_QueryBuilder::truncate('TableName')
   ->execute();

Комментарии

  • Без темы

    Поддерживается выборка:
    ->where('field', 'IN', array(1,2,3))

    а поддерживается ли
    ->where('field', 'NOT IN', array(1,2,3))

    ?

    23.07.2014 19:38:32 web-alt
  • Levsha

    Без темы

    Стоит упомянуть, что перед использованием orderBy() со стандартными модулями системы, часто предварительно нужно очистить сортировку методом ->clearOrderBy()

    Например:
    $Shop_Controller_Show
    ->shopItems()
    ->queryBuilder()
    ->clearOrderBy()
    ->orderBy('shop_items.shop_group_id')

    18.06.2014 10:01:27 Levsha