我在yii2中是全新的,我想知道查询中冒号是什么意思?
我已经对绑定参数进行了研究,但在yii2文档中说:
// returns all inactive customers
$sql = 'SELECT * FROM customer WHERE status=:status';
哪一方来自数据库?左侧还是右侧?
这是一个简单的文本,哪一个是DB的列?我很困惑。
在没有冒号的情况下进行查询的另一种方法是什么?它有效吗?
为什么它在下一个例子中有'anyo = **:**valor'
?还有一些不?
$dbLibro = Libro::find()->where('tipo = "Nacimiento"')->andWhere('cerrado = 0')->andWhere('anyo = :valor',[':valor'=>date("Y")])->one();
我希望明确的原因是文档对我来说有点混乱。
答案 0 :(得分:3)
冒号与Yii2没有直接关系,它与Yii2使用的PHP PDO extension相关。
每个冒号都是占位符,稍后用于绑定值。检查例如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
因此,左侧(等于之前)表示列名,右侧部分 - 将在之后安全绑定的值。
但是你不必自己写params,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
参数,请注意,在这种情况下,列名也是双引号。
如果您尝试使用更多条件,则参数将为: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。