2

我是 yii2 的新手,我想知道查询中的冒号是什么意思?

我已经对绑定参数进行了研究,但是在 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();

我希望它清楚的原因是文档对我来说有点混乱。

4

1 回答 1

3

冒号与 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 使用数据库函数进行计算。

于 2015-11-10T04:08:42.610 回答