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

标签 yii2 yii2-basic-app yii2-model

我是 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/

相关文章:

mysql - 有没有办法检查数据库表是否已经包含 Yii2 中具有特定值的记录

php - yii2访问post json数据出错

yii2 - 如何在 yii2 的目录中创建目录并将文件上传到该目录

yii2 - 使用干净的 url 在 yii2 中的超链接中传递多个参数,Html::a() 不会生成干净的 url

php - 仅当变量在 PHP 中具有值时才将变量添加到数组?

php - Yii2 GridView 过滤 sql

MySQL 左/右/外连接

php - Yii2 Restful api 对象未找到错误

php - 如何在 yii2 的 radioList() 中添加不同和公共(public)的类

yii2 - 如何在 Yii2 上对表进行分区?