我是 yii2 的新手,我想知道查询中的冒号是什么意思?
我对绑定(bind)参数进行了研究,但在 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();
我希望它是明确的,因为文档对我来说有点困惑。
最佳答案
冒号与 Yii2 没有直接关系,它与 PHP PDO extension 有关。 Yii2 使用的。
每个冒号都是占位符,稍后用于绑定(bind)值。检查例如 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
因此左侧(等于之前)代表列名称,右侧部分 - 将在之后安全绑定(bind)的值。
但是你不必自己编写参数,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
将绑定(bind)到 :qp1
参数,请注意,在这种情况下,列名也用双引号引起来。
如果您尝试使用更多条件,参数将为 :qp2
、:qp3
等(默认 PARAM_PREFIX
为 :qp
)。
至于你的第二个查询,可以这样重写:
$model = Libro::find()
->where([
'tipo' => 'Nacimiento',
'cerrado' => 0,
'anyo' => date('Y'),
])->one();
在这种状态下,此类查询看起来更好、更易读。
Yii2 允许在查询中生成更复杂的条件,请检查 this section文档以获取更多详细信息。
P.S. 在代码中最好使用英文命名。考虑一下支持您的代码的其他国际开发人员。 date('Y')
可以使用数据库函数计算,具体取决于所使用的 RDBMS。
关于yii2 - 查询 yii2 框架中的冒号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33622344/