工作中或多或少会用到的关于 Yii2 的小技巧的一个总结,包括model、controller、view或者配置文件的一些写法。

模型相关

获取查询SQL

$query = User::find()->where(['LIKE', 'name', 'ad%', false]);

$commandQuery = clone $query;
echo $commandQuery->createCommand()->getRawSql(); // SELECT * FROM `user` WHERE `name` LIKE 'ad%'

查询数据表中具体列

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

模型中事务编写

Yii::$app->db->transaction(function() {
$order = new Order($customer);
$order->save();
$order->addItems($items);
}); // 这相当于下列冗长的代码:
$transaction = Yii::$app->db->beginTransaction();
try {
$order = new Order($customer);
$order->save();
$order->addItems($items);
$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_id 在 Country 中是否存在,一般用于一些外键关联的数据表之间的数据约束。

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

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

public function rules()
{
return [
[['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 模糊查询

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

执行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);

andor共用

在查询时,andor条件共用。

Topic::updateAll(
['last_comment_time' => new Expression('created_at')],
// ['or', ['type' => Topic::TYPE, 'last_comment_username' => ''], ['type' => Topic::TYPE, 'last_comment_username' => null]]
['and', ['type' => Topic::TYPE], ['or', ['last_comment_username' => ''], ['last_comment_username' => null]]]
);

嵌套查询

$subQuery = new Query();
$subQuery->from(PostComment::tableName())->where(['status' => PostComment::STATUS_ACTIVE])->orderBy(['created_at' => SORT_DESC]);
$comment = PostComment::find()->from(['tmpA' => $subQuery])
->groupBy('post_id')
->all();

生成如下语句: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;

文件下载

存在一个文件地址,关于一些下载需要的header头信息Yii2已经帮我们完成,如下操作即可。

public function actionDownload($id)
{
$model = $this->findModel($id); if ($model) {
// do something
}
return \Yii::$app->response->setDownloadHeaders($model->downurl);
}

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

打印数据

\yii\helpers\VarDumper::dump($var);

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

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

Yii::$app->runAction('new_controller/new_action', $params);
// 或者
return (new SecondController('second', Yii::$app->module))->runAction('index', $data);

获取GET数据

Yii::$app->getRequest()->get('id');

视图相关

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

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

Yii::$app->controller->id

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

防止SQL注入或者XSS攻击

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

配置相关

用户组件登录修改

修改登陆状态超时时间(到期后自动退出登陆) 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'],
];

Yii2开发小技巧的更多相关文章

  1. Windows统一平台: 开发小技巧

    Windows统一平台: 开发小技巧 技巧一: 在手机端拓展你应用的显示区域.(WP8.1中也适用) 对于Windows Phone系统的手机, 手机屏幕最上方为系统状态栏(System Tray), ...

  2. flex开发小技巧集锦

    关于flex开发网上有非常多的相关信息介绍,因此我们要想学习关于flex开发的知识信息技能是一件非常简单和方便的事情.而针对于flex开发小编要告诉大家的是一些flex开发小技巧.利用这些小技巧能够有 ...

  3. TP开发小技巧

    TP开发小技巧原文地址http://wp.chenyuanzhao.com/wp/2016/07/23/tp%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7/ ...

  4. 移动Web开发小技巧

    移动Web开发小技巧 添加到主屏后的标题(IOS) name="apple-mobile-web-app-title" content="标题"> 启用  ...

  5. BizTalk开发小技巧

    BizTalk开发小技巧 随笔分类 - Biztalk Biztalk 使用BizTalk实现RosettaNet B2B So Easy 摘要: 使用BizTalk实现RosettaNet B2B ...

  6. Java开发小技巧(三):Maven多工程依赖项目

    前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...

  7. iOS开发小技巧 - UILabel添加中划线

    iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...

  8. PHP开发小技巧②—实现二维数组根据key进行排序

    在PHP中内置了很多对数组进行处理的函数,有很多时候我们直接使用其内置函数就能达到我们的需求,得到我们所想要的结果:但是,有的时候我们却不能通过使用内置函数实现我们的要求,这就需要我们自己去编写算法来 ...

  9. PHP开发小技巧③—实现多维数组转化为一维数组

    在平常的项目开发中我们多会用到让多维数组转化为一维数组的情况,但是很多Programmer不会将其进行转化,也有些没有想到很好的算法然后经过乱起八糟的运算方式将其勉强转化好,但是所写的程序代码冗余非常 ...

随机推荐

  1. H2O 网址

    使用pysparking的一个例子 http://docs.h2o.ai/h2o-tutorials/latest-stable/tutorials/sparkling-water/index.htm ...

  2. STLの应用

    QAQ因为绝望地发现好像这些应用都没有题目...所以就专门开了个随笔存题面qwq 谁的孙子最多 给定一棵树,其中1号节点是根节点,问哪一个节点的孙子节点最多,有多少个.(孙子节点,就是儿子节点的儿子节 ...

  3. python显示进度条

    当一个python任务是需要逐个处理相同的事物时(里面有循环操作,例如对一系列的文件进行处理),这时可以将处理的进度条加进来,下面是一个例子: import time import sys def v ...

  4. dedecms后台左侧菜单500错误怎么处理

    前面dedecms后台左侧菜单空白不显示怎么处理,但有些网友还是反应说不能显示,提示500错误,这可能是iis配置或apache设置不正确有关,一般是正常的.但是,既然问题出现了,我们还是要去解决.下 ...

  5. cxLookupComboBox使用方法

    示例 //选择修改时执行procedure TForm1.cxLookupComboBox1PropertiesChange(Sender: TObject); begin edit1.Text:=V ...

  6. 利用Python实现简单的相似图片搜索的教程

    大概五年前吧,我那时还在为一家约会网站做开发工作.他们是早期创业公司,但他们也开始拥有了一些稳定用户量.不像其他约会网站,这家公司向来以洁身自好为主要市场形象.它不是一个供你鬼混的网站——是让你能找到 ...

  7. gluster 卷的类型及创建方法

    基本卷: 分布式卷 文件随机分布在brick中,提升读写性能 不提供数据冗余,最大化利用磁盘空间 # gluster volume create test-volume server1:/exp1 s ...

  8. 软RAID管理命令mdadm详解

    软RAID管理命令mdadm详解 mdadm是linux下用于创建和管理软件RAID的命令,是一个模式化命令.但由于现在服务器一般都带有RAID阵列卡,并且RAID阵列卡也很廉价,且由于软件RAID的 ...

  9. 2019.03.18 连接my sql

    11.登陆功能(链接MySQL) python manage.py starapp movie 新建一个应用模块之后要记得到setting添加这个应用模块 在python2中你还有去导入一个MySQL ...

  10. CentOS6.5配置MYSQL一主多从详解

    一.环境 操作系统 :CentOS 6.5 数据库版本:MySQL 主机A:192.168.1.1 (Master) 从机B:192.168.1.2 (Slave) 从机B:192.168.1.3 ( ...