Двоеточия напрямую не связаны с 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')
может быть рассчитан с использованием функций базы данных в зависимости от используемой РСУБД.