冒号与 Yii2 没有直接关系,它与 Yii2 使用的PHP PDO 扩展有关。
每个冒号都是稍后用于绑定值的占位符。例如检查这个问题。
如果我们将这个查询写在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
所以左侧(等号之前)代表列名,右侧部分 - 将在之后安全绑定的值。
但是你不必自己写params,Yii2QueryBuilder
会自动为你生成。
还有其他方法可以编写不带冒号的查询,并且使用频率更高。这个查询可以这样写:
$query = Customer::find(['status' => Customer::STATUS_ACTIVE]);
$models = $query->all();
或者像这样使用快捷方式:
$models = Customer::findAll(['status' => Customer::STATUS_ACTIVE]);
或者它甚至可以放在一个范围内:
$models = Customer::find()->active();
在这种情况下,Yii 会自动生成参数,它等价于:
SELECT * FROM "customer" WHERE "status"=:qp1
值1
将绑定到:qp1
参数,请注意,在这种情况下,列名也是双引号。
如果您尝试使用更多条件,则参数将为:qp2
,:qp3
依此类推(默认PARAM_PREFIX
为:qp
)。
至于您的第二个查询,可以这样重写:
$model = Libro::find()
->where([
'tipo' => 'Nacimiento',
'cerrado' => 0,
'anyo' => date('Y'),
])->one();
在这种状态下,这样的查询看起来更好、更易读。
Yii2 允许在查询中生成更复杂的条件,请查看文档的这一部分以获取更多详细信息。
PS最好在代码中使用英文命名。想想其他支持您的代码的国际开发人员。date('Y')
可以根据使用的 RDBMS 使用数据库函数进行计算。