在查询yii2框架中冒号是什么意思?

时间:2015-11-10 03:26:15

标签: yii2 yii2-basic-app yii2-model

我在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();

我希望明确的原因是文档对我来说有点混乱。

1 个答案:

答案 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。