YII2常用方法总结

输出sql语句

$query = self::findOne(1);
echo $query->createCommand()->getRawSql();

复杂的sql语句拼接

在model中使用复杂的sql时,Yii会出现解析错误的情况。例如

$query = User::find()->all();
$query->select("*,FROM_UNIXTIME('create_time','%Y-%m-%d') as date");

以上生成的sql语句中,yii会把````FROM_UNIXTIME(‘create_time’,‘%Y-%m-%d’)` ```当做是一个字段,以至报错。

此时我们在头部引入 use yii\db\Expression;使用方法如下

use yii\db\Expression;
$query = User::find()->all();
$query->select(new Expression("*,FROM_UNIXTIME('create_time','%Y-%m-%d') as date"));

YII框架自带的JSON方法

使用AR获取的数据列表,不能直接使用json_encode进行序列化,会丢失数据。使用yii\helpers\Json::encode($data);进行序列化,可以保证数据的完整性,要注意命名空间的大小写。mmp,这个问题耽误老子俩小时

使用自定义的model

即不指定表名,主要用于验证用户提交的数据,自己新建的继承AR的model,需要注意:

①不能使用$model->attributes = $param赋值,只能使用$model->load($param,'')

②不能使用场景,会提示表不存在

修改数据提供器数据

场景1
通过数据提供器获取数据列表后,某些字段我们可能想要单独赋值,比如当username为空时,我们想要给username赋值为“游客”。

$list = $dataProvider->getModels();
foreahc($list as $val){
	//usernam必须是主表中的字段
	if(!$val->username)	$val->username = '游客';
}
$dataProvider->setModels($list);

但是上面的赋值方式中,当username不是主表字段时,会报错。比如数据提供器查询中,使用了with关联users,users作为一个关联值,修改时会提示不能修改只读属性。
在这里插入图片描述

这种情况下,我们需要在数据提供器model中添加如下代码

//model中加入如下代码
public function __set($attributes,$val){
	if($attributes == 'users')	$this->$attributes = $val;
}
//赋值代码
$list = $dataProvider->getModels();
foreahc($list as $val){
	if(!$val->users)	$val->users= object(['username'=>'游客']);
}
$dataProvider->setModels($list);

数据模型中,会追加一个可读的users对象属性。
当我们再次通过getModels获取models数组,遍历models数组,使用其成员model调用users时,就会获取到users属性的值了

场景2
但是上面的方法存在局限性。当我们使用\yii\rest\Serialize 的serialize()方法序列化数据提供器时,通过上述方法新增的属性并没返回。这是因为serialize()方法只把主表的字段进行了返回,如果想返回新增的字段,就需要修改model的attribute值,代码如下

public function attributes()
    {
        $attribute = parent::attributes();
        $attribute[] = 'users';
        return $attribute;
    }

注意: 在使用该方法添加新的字段,并在实例化对象中给该字段赋值后,不能使用model对象的save()方法进行数据的添加和修改,这会把新增的字段添加到sql操作中,而数据表中根本不存在该字段,导致不错。

yii框架接口分页

Yii框架的数据提供及ActiveDataProvider 配合页面小部件可以实现内容分页。当我们使用yii写前台接口时,也可以使用数据提供器来实现数据的分页,步骤如下

//首先,获取数据提供器
$data =  new ActiveDataProvider([
    'query' => $query
]};
//然后使用yii/rest/serializer类中的serializer方法序列化数据提供器的数据
$serializer = new yii/rest/serializer();
return $serializer->serialize($data);

执行serialize() 方法后,会在返回的hearder信息中添加分页相关的信息。方法说明如下图
在这里插入图片描述

数据验证

可查看官方文档:核心验证器
这里是提示下,文件验证的时候,设置
[‘primaryImage’, ‘file’, ‘extensions’ =>[‘png’,‘jpg’,‘gif’],‘maxSize’=>102410241024],‘checkExtensionByMimeType’=>false]
checkExtensionByMimeType默认为true,需要设置为false。
是否通过文件的 MIME 类型来判断其文件扩展。 若由 MIME 判定的文件扩展与给定文件的扩展不一样,则文件会被认为无效

with的使用

1、语法

yii2联表查询除了可以使用join,还可以使用with进行联表查询。有with和joinWith两个方法可使用。
差异:
with:以主表内容为主,关联表的筛选条件对主表无效
joinWith:以主表内容为主,关联表查询条件会影响主表的查询内容

//多个关联多个表时,joinWith内以数组方式设置参数
$query = CpOrderFission::find()->joinWith([
	//自2.0.7开始,可直接在关联表后加字符串,作为关联别名
	//不需要再使用$q->from(['su' => User::tableName()])或$q->alias('su')来设置别名
    'shareUsers su' => function($query)use($where){
        $query
        //追加当前关联表的查询条件
        ->andFilterWhere($where)
        //追加当前关联和主表的关联条件
        ->onCondition($where2)
        //嵌套关联,即主表A关联b,b关联c;需要在shareUsers的主表model中,添加getRegister方法
        ->joinWith('register');
    },
    'orders o',
])
//当需要查询额外的字段时,需要设置select
 ->select([
		CpOrderFission::tableName().'.*',
        //新增的set_num字段需要在主表model中声明后才能使用
        'count(case when is_set=1 then id end) as set_num',
	]);

2、关联子查询
//建立子查询sql
$sub_query = (new \yii\db\Query())->from('table_name')->where('')->groupBy('order_id');
//关联
$query->leftJoin(['fx'=>$sub_query],'fx.id=table_name.id');

命令行执行yii控制器方法

可以通过yii框架中,项目根目录中的yii文件访问

yii代码如下

<?php
/**
 * Yii console bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require __DIR__ . '/common/config/bootstrap.php';
//cli运行模式配置文件
$config = require(__DIR__ . '/common/config/console.php');

$application = new yii\console\Application($config);
//需要访问的应用主体的别名配置文件
require __DIR__ . '/appapi/common/config/bootstrap.php';
$exitCode = $application->run();
exit($exitCode);

yii文件配置好后,配置console.php配置文件,如下

<?php

$params = require(__DIR__ . '/params.php');
$db = require(__DIR__ . '/database.php');

$config = [
    'id' => 'basic-console',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    //当应用不分模块时,需配置控制器的命名空间
	//'controllerNamespace' => 'app\commands',
	//当应用分多模块时,需配置模块的命名空间
    'modules'   => [
        'v1' => 'app\modules\v1\Module',
    ],
    //方法中用到的组件也要在这里配置
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'db' => $db,
    ],
    'params' => $params,
    /*
    'controllerMap' => [
        'fixture' => [ // Fixture generation command line.
            'class' => 'yii\faker\FixtureController',
        ],
    ],
    */
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;

控制器文件,如下

<?php
namespace app\modules\v1\controllers;

use yii\console\Controller;
//此处继承console下的controller,专门用于cli执行
class Message2Controller extends Controller
{

    public function actionWork(){
        echo 'Hello World';
    }
}

在cmd下,先cd到yii文件目录下,然后执行

//多模块执行
php yii v1/message2/work
//单模块执行
php yii message2/work
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Yii 2.0 权威指南 本教程的发布遵循 Yii 文档使用许可. 版权所有 2014 (c) Yii Software LLC. 介绍 已定稿 关于 Yii 已定稿 从 Yii 1.1 升级 入门 已定稿 安装 Yii 已定稿 运行应用 已定稿 第一次问候 已定稿 使用 Forms 已定稿 玩转 Databases 已定稿 用 Gii 生成代码 已定稿 更上一层楼 应用结构 已定稿 结构概述 已定稿 入口脚本 已定稿 应用 已定稿 应用组件 已定稿 控制器(Controller) 已定稿 视图(View) 已定稿 模型(Model) 已定稿 过滤器 已定稿 小部件(Widget) 已定稿 模块(Module) 已定稿 前端资源(Asset) 已定稿 扩展(extensions) 请求处理 已定稿 运行概述 已定稿 引导(Bootstrapping) 已定稿 路由(Route)引导与创建 URL 已定稿 请求(Request) 已定稿 响应(Response) 已定稿 Sessions(会话)和 Cookies 已定稿 错误处理 已定稿 日志 关键概念 已定稿 组件(Component) 已定稿 属性(Property) 已定稿 事件(Event) 已定稿 行为(Behavior) 已定稿 配置(Configurations) 已定稿 类自动加载(Autoloading) 已定稿 别名(Alias) 已定稿 服务定位器(Service Locator) 已定稿 依赖注入容器(DI Container) 配合数据库工作 编撰中 数据访问对象(DAO) - 数据库连接、基本查询、事务和模式操作 编撰中 查询生成器(Query Builder) - 使用简单抽象层查询数据库 编撰中 活动记录(Active Record) - 活动记录对象关系映射(ORM),检索和操作记录、定义关联关系 编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中 多模型同时输入 显示数据 编撰中 格式化输出数据 待定中 分页(Pagination) 待定中 排序(Sorting) 编撰中 数据提供器 编撰中 数据小部件 编撰中 主题 安全 编撰中 认证(Authentication) 编撰中 授权(Authorization) 编撰中 处理密码 待定中 客户端认证 待定中 安全领域的最佳实践 缓存 已定稿 概述 已定稿 数据缓存 已定稿 片段缓存 已定稿 分页缓存 已定稿 HTTP 缓存 RESTful Web 服务 已定稿 快速入门 已定稿 资源 已定稿 路由 已定稿 格式化响应 已定稿 授权验证 已定稿 速率限制 已定稿 版本化 已定稿 错误处理 已定稿 测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值