Yii2 开发小技巧

获取执行的 SQL 语句

$query = User::find()->where(['LIKE', 'name', 'php%', false]);
$commandQuery = clone $query;
// SELECT * FROM `user` WHERE `name` LIKE 'php%'
echo $commandQuery->createCommand()->getRawSql();

查询数据表中具体字段

return \yii\helpers\ArrayHelper::getColumn(User::find()->all(), 'name');
return User::find()->select('name')->asArray()->column();

Expression()函数

* 使用`find_in_set()`等函数,需要用到`Expression()` 表达式。
User::find()
    ->where(new yii\db\Expression('FIND_IN_SET(:status, status)'))
    ->addParams([':status' => 1])
    ->all();
* 避免select里的子查询被识别成字段
$quert = User::find()
    ->select([
          new Expression('count(*) as count , count(distinct mobile) as mnumber')
     ])->asArray()
    ->all();

Yii2 中使用事务

$transaction = $connection->beginTransaction();
try {
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    // ... 执行其他 SQL 语句 ...
    $transaction->commit();
} catch(Exception $e) {
    $transaction->rollBack();
    throw $e;
}

Model 里 rules 联合唯一规则

即建立了联合唯一索引的字段,验证时保证数据的完整。

[
    ['store_id', 'member_name'],
    'unique',
    'targetAttribute' => ['store_id', 'member_name'],
    'message'         => 'The combination of Store ID and Member Name has already been taken.'
]

是否存在的规则

校验 country_idCountry 中是否存在,一般用于一些外键关联的数据表之间的数据约束。

[
    ['country_id'],
    'exist',
    'skipOnError'     => true,
    'targetClass'     => Country::className(),
    'targetAttribute' => ['country_id' => 'id'],
    'message'         => '此{attribute}不存在。'
]

表单验证两个字段选取一个

[
    ['card_id', 'card_code'],
    //至少要一个
    function ($attribute, $param) {
        if (empty($this->card_code) && empty($this->card_id)) {
            $this->addError($attribute, 'card_id/card_code至少要填一个');
        }
    },
    'skipOnEmpty' => false
]

Like 模糊查询

// SELECT * FROM `user` WHERE `name` LIKE 'php%'
$query = User::find()->where(['LIKE', 'name', 'php%', false]);

执行 SQL 查询并缓存结果

调用yii\db\Connection的cache方法,写入回调函数执行SQL查询并缓存结果。

$id = Yii::$app->request->get('id');
$collection = Yii::$app->db->cache(function (Connection $db) use($id){
    return self::findOne(['id'=>$id]);
}, 10); // 缓存10秒
var_dump($collection);

嵌套查询

$subQuery = new Query();
$subQuery->from(PostComment::tableName())->where(['status' => PostComment::STATUS_ACTIVE])
        ->orderBy(['created_at' => SORT_DESC]);

生成如下语句:SELECT * FROM (SELECT * FROMpost_commentWHEREstatus=1 ORDER BYcreated_atDESC)tmpAGROUP BYpost_id``


获取当前模块/控制器/动作的 id

$this->module->id
$this->id
$this->action->id

打印表单提交失败错误信息

echo array_values($model->getFirstErrors())[0];
exit;

文件下载

public function actionDownload()
{
    // downUrl
    return \Yii::$app->response->setDownloadHeaders($model->downUrl);
}

模型的downurl属性可以通过 extraFields()进行设置。

打印数据

\yii\helpers\VarDumper::dump($var);
// 第二个参数是数组的深度  第三个参数是是否显示代码高亮(默认不显示)
\yii\helpers\VarDumper::dump($var, 10 , true);

控制器中调用其他控制器方法

// 方法一
Yii::$app->runAction('new_controller/new_action', $params);
// 方法二
return (new SecondController('second', Yii::$app->module))->runAction('index', $data);

获取GET数据

Yii::$app->getRequest->get('id');
// 效率更高
Yii::$app->getRequest()->get('id');

视图中获取当前模块/控制器/方法id

Yii::$app->controller->module->id;
Yii::$app->controller->id
Yii::$app->controller->action->id

防止 SQL 注入或者 XSS 攻击

// 可以原样显示<script></script>代码,但不解析
echo yii\helpers\Html::encode($view_hello_str)
// 可以过滤掉<script></script>代码
echo yii\helpers\HtmlPurifier::process($view_hello_str)

用户组件登录修改

修改登陆状态超时时间(到期后自动退出登陆) config/web.php中的components组件数组中。

'user' => [
    'class'         => 'yii\web\User',
    'identityClass' => 'common\models\User',
    'loginUrl'      => ['/user/sign-in/login'],
    'authTimeout'   => 1800, // 登陆有效时间
    'as afterLogin' => 'common\behaviors\LoginTimestampBehavior'
],

配置文件IP白名单

通过下面的IP地址方式配置debug的显示,便于调试代码。

$config['modules']['debug'] = [
    'class'      => 'yii\debug\Module',
    'allowedIPs' => ['127.0.0.1', '192.168.0.*', '192.168.33.1'],
];

(完)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AILearning

Apache Zeppelin 中 Cassandra CQL 解释器

Name Class Description %cassandra CassandraInterpreter 为Apac...

3079
来自专栏Spark学习技巧

实战phoenix

一 安装部署 1, 下载 http://archive.apache.org/dist/phoenix/ 本文下载的是apache-phoenix-4.12....

40210
来自专栏乐沙弥的世界

SQL*Loader使用方法

SQL*Loader由一个输入控制文件来控制整个装载的相关描述信息,一个或多个数据文件作为原始数据,其详细组成结构包括

1142
来自专栏云计算教程系列

想熟悉PostgreSQL?这篇就够了

PostgreSQL是自由的对象-关系型数据库服务器,在灵活的BSD风格许可证下发行。它在其他开放源代码数据库系统和专有系统之外,为用户又提供了一种选择。 我们...

2402
来自专栏互联网杂技

SQL注入攻防入门详解

毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口。这几...

58610
来自专栏杨建荣的学习笔记

MySQL中的大小写敏感

今天同事问了一个问题,是关于MySQL大小写敏感的。 如果根据关键字case来搜索,会发现有两个参数。 mysql> show variables like ...

4106
来自专栏Snova云数仓

Greenplum资源队列初识

在Greenplum的4.x版本之后,加入了资源队列的概念,其主要作用就是限制用户或者单个SQL对资源的消耗。避免出现消耗过多资源,影响其他用户或者SQL计算。...

80914
来自专栏*坤的Blog

注入学习1:SQL注入语句大全

之前做了xss预防,以及些许的注入预防了,但是不够全面,如果还是搜集了下一些常用的注入手段,以此用来进行更好的预防.

5022
来自专栏微信公众号:Java团长

Java面试中常问的数据库方面问题

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的

1213
来自专栏乐沙弥的世界

RMAN 提示符下执行SQL语句

       在手动恢复数据库时,有时候需要在SQL*Plus提示符以及操作系统提示符,RMAN提示符下来回切换显得有些繁琐。实际上RMAN为我们提供了命令行下...

1193

扫码关注云+社区

领取腾讯云代金券