Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

пятница, 5 февраля 2010 г.

Язык запросов ORM Doctrine. DQL (Doctrine Query Language). Запрос SELECT.

Запросы SELECT.

Синтаксис оператора SELECT:

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

SELECT используется для извлечения данных одного или более компонентов.

Каждый select_expr указывает на колонку или группу колонок таблицы, которую вы хотите получить. Должно быть не менее одного выражения (select_expr).

Для примера, занесем в базу данных несколько аккаунтов пользователей:

// test.php

// ...
$account = new Account();
$account->name = 'test 1';
$account->amount = '100.00';
$account->save();

$account = new Account();
$account->name = 'test 2';
$account->amount = '200.00';
$account->save();


Выполните test.php:
$ php test.php

Теперь вы можете протестировать выборку данных со следующими ниже примерами запросов:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('a.name')
        ->from('Account a');

echo $q->getSqlQuery();

Посмотрим на sql, который генерируется данным запросом:
SELECT a.id AS a__id, a.name AS a__name FROM account a

// test.php

// ...
$accounts = $q->execute();
print_r($accounts->toArray())

Результат обоих примеров будет одинаков:
$ php test.php
Array
(
    [0] => Array
    (
        [id] => 1
        [name] => test 1
        [amount] =>
    )

    [1] => Array
    (
        [id] => 2
        [name] => test 2
        [amount] =>
    )
)

FROM указывает на компонент или компоненты, из которых извлекаются записи:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username, p.*')
        ->from('User u')
        ->leftJoin('u.Phonenumbers p')

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username, p.id AS p__id, 
p.user_id AS p__user_id, p.phonenumber AS p__phonenumber 
FROM user u LEFT JOIN phonenumber p ON u.id = p.user_id

В аргументе WHERE, если оно присутствует, указывается условие или условия, которым должны удовлетворять записи при выборке. where_condition - это условие которое истинно для каждой строки в выборке. Если не задан аргумент WHERE, запрос выбирает все строки.
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('a.name')
        ->from('Account a')
        ->where('a.amount > 2000');

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT a.id AS a__id, a.name AS a__name FROM account a WHERE a.amount > 2000

В предложении WHERE, вы можете использовать любую из функций или операторов, которые поддерживают DQL, за исключением функций агрегирования. HAVING может быть использована для сужения результатов со статистическими функциями:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username')
        ->from('User u')
        ->leftJoin('u.Phonenumbers p')
        ->having('COUNT(p.id) > 3');

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username FROM user u 
LEFT JOIN phonenumber p ON u.id = p.user_id HAVING COUNT(p.id) > 3

Выражение ORDER BY может быть использована для сортировки результатов:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username')
        ->from('User u')
        ->orderBy('u.username');

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username FROM user u ORDER BY u.username

Выражения LIMIT и OFFSET могут быть использованы для эффективного ограничения количества записей до заданного row_count:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username')
        ->from('User u')
        ->limit(20);

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username FROM user u LIMIT 20

Комментариев нет:

Отправить комментарий