2015-11-10 2 views
2

Я совершенно новый в yii2, и я хочу знать, что это означает двоеточие в запросе?Что означает двоеточие в запросах yii2 framework?

Я сделал исследование о связывании параметров, но в документации yii2 говорит:

// returns all inactive customers 
$sql = 'SELECT * FROM customer WHERE status=:status'; 

, какая сторона из базы данных? с левой стороны или с правой стороны?

который является простым текстом, а какой - столбцом из БД? Я весьма озадачен.

Каким будет другой способ сделать запрос без двоеточия? действительно ли это?

Почему у этого есть 'anyo = **:**valor' в следующем примере? и некоторые другие?

$dbLibro = Libro::find()->where('tipo = "Nacimiento"')->andWhere('cerrado = 0')->andWhere('anyo = :valor',[':valor'=>date("Y")])->one(); 

Надеюсь, что его явная причина в том, что документация немного запутанна для меня.

ответ

2

Двоеточия напрямую не связаны с Yii2, это связано с PHP PDO extension, которое используется Yii2.

Каждый двоеточие является заполнителем, используемым позднее для привязки. Проверьте, например, this question.

Если записать этот запрос в ActiveQuery:

SELECT * FROM customer WHERE status = :status 

мы можем получить что-то вроде этого:

$query = Customer::find()->where('status = :status', [':status' => Customer::STATUS_ACTIVE]); 

Допуская STATUS_ACTIVE константа равна 1, после выполнения его трансформирует этому:

SELECT * FROM "customer" WHERE status = 1 

Значит, лев t side (before equals) представляет имя столбца, правую часть - значение, которое будет безопасно привязано после.

Но вам не нужно писать параметры самостоятельно, Yii2 QueryBuilder автоматически генерирует его для вас.

Есть другие способы писать запрос без двоеточий, и они используются чаще. Этот запрос может быть записана следующим образом:

$query = Customer::find(['status' => Customer::STATUS_ACTIVE]); 
$models = $query->all(); 

Или как это с помощью ярлыка:

$models = Customer::findAll(['status' => Customer::STATUS_ACTIVE]); 

Или это может быть даже положить внутрь scope:

$models = Customer::find()->active(); 

В этом случае Yii автоматически генерирует параметры, и это будет эквивалентно этому:

SELECT * FROM "customer" WHERE "status"=:qp1 

Значение 1 будет привязано к параметру :qp1, обратите внимание, что в этом случае имена столбцов также имеют двойные кавычки.

Если вы пытаетесь использовать несколько условий, PARAMS будет :qp2, :qp3 и так далее (по умолчанию PARAM_PREFIX является :qp).

Что касается вашего второго вопроса, то можно переписать так:

$model = Libro::find() 
    ->where([ 
     'tipo' => 'Nacimiento', 
     'cerrado' => 0, 
     'anyo' => date('Y'), 
    ])->one(); 

Такие запросы выглядят намного лучше и читаемым в этом состоянии.

Yii2 позволяет создавать еще более сложные условия в запросах, для получения более подробной информации см. Документ this section.

P.S. Лучше использовать английский для именования в коде. Подумайте о других международных разработчиках, поддерживающих ваш код. date('Y') может быть рассчитан с использованием функций базы данных в зависимости от используемой РСУБД.