Yii2 学习

Yii2 学习心得

<?php
/**
* Yii框架的数据库查询是基于pdo来执行的
* main-local 这种凡是带local的是为了避免开发冲突设计的,可以在本地修改配置,但是不要提交就可以
*/

//sql查询
Yii::$app->db->createCommand('select * from post')->queryAll();
Yii::$app->db->createCommand('select * from post')->queryOne();

//根据id查询sql
Yii::$app->db->createCommand('select * from post where id = :id and status = :status')
->bindValue(':id',$_GET['id'])
->bindValue(':status',1)
->queryAll();


//使用ActiveRecord查询
Post::find()->where(['id'=>1])->all();
Post::find()->where(['id'=>1])->one();

//设置查询条件
$posts = Post::find()->where(['AND',['status'=>2],['author_id'=>1],['like','title','标题内容']])->orderby('id')->all();

findBySql();//这也是一种查询方法

//或者

Post::findOne(1);
Post::findAll(['id'=>1,]);

//输出id
$model = Post::findOne(1);
echo $model->id;


//curl其中save可以代替insert和update
//添加
$post = new Post();
$post->id = 1;
$post->status = 2;
$post->save();//等同于insert

//修改
$post = Post::findOne($id);
$post->status = 1;
$post->save();//等同于修改

//删除
$post = Post::findOne($id);
$post->delete();


//DetailView用于显示一条记录的数据
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'title',
'content:ntext',
'tags:ntext',
'status',
'create_time:datetime',
'update_time:datetime',
'author_id',
],
]),

//。。。。。。。还可以添加属性控制表单样式
'template'=>'<tr><th style="width: 120px;">{label}</th><td>{value}</td></tr>',//设置label的样式
'options'=>['class'=>'table table-striped table-bodered detail-view'],//设置整个表格的属性样式
?>


像上面的这种ntext、datetime这种的都是展示的格式
ntext会把网页的标签都展示出来
datetime展示的yii的时间形式Sep 23, 2015 4:51:54 PM

变化时间那么就用这种样子的
[
'attribute'=>'update_time',
'value'=>date('Y-m-d H:i:s',$model->update_time),
],

 


//ListView和GirdView可以对数据进行分页、排序和过滤
hasOne用于多对一、一对一的情况
hasMany用于一对多的情况


例如:我的model层代码有
public function getStatus0()
{
return $this->hasOne(Poststatus::className(), ['id' => 'status']);
}

那么我在展示的时候就可以写成:
[
'label'=>'状态',
'value'=>$model->status0->name,
],

或者

public function getAuthor()
{
return $this->hasOne(Adminuser::className(), ['id' => 'author_id']);
}

展示也可以写成
[
'attribute'=>'author_id',
'value'=>$model->author->nickname,
]

 

//别名-用来替代网址或者一些路径之类的(必须用@开头)
Yii::setAlias('@foo','/path/to/foo');//文件路径别名
Yii::setAlias('@foo','http://www.baidu.com');//URL别名

别名的使用

$cache = new FileCache([
'cachePath'=>'@runtime/cache',
]);

 

//下拉框示例
<?= $form->field($model, 'status')
->dropDownList(['1'=>'草稿','2'=>'已发布'],['prompt'=>'请选择状态']);
?>

那么和数据库交互以后的下拉框可以这样写
<?php
$poststatus = Poststatus::find()->all();//model也是要注意引用
$allStatus = ArrayHelper::map($poststatus,'id','name');//类文件需要引用以后才可以这样简写ArrayHelper
?>
<?= $form->field($model, 'status')
->dropDownList($allStatus,
['prompt'=>'请选择状态']);?>

又或者这样写:
<?php
$psArray = Yii::$app->db->createCommand('select id,name from poststatus')->queryAll();
$allStatus = ArrayHelper::map($psArray,'id','name');
?>


又或者用query-buider
<?php
$allStatus = (new \yii\db\query())
->select(['name','id'])
->from('poststatus')
->indexBy('id')
->column();
?>


或者
<?php
$allStatus = Poststatus::find()
->select(['name','id'])
->orderBy('position')
->indexBy('id')
->column();
?>

 

 


//from查询(支持将查询出来的结果当成一张表再查询)
$subQuery = (new \yii\db\Query())->select('id')->from('user')->where('status=1');
$query->from(['u'=>$subQuery]);


//limit的用法
$query->limit(10)->offset(20); 表示从第20条开始取数,取10条记录


关于查询的一些语法可以参考http://www.yiichina.com/doc/guide/2.0/db-query-builder

 

图片总结:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 preg_split('/\s*,\s*/',trim($tags),-1,PREG_SPLIT_NO_EMPTY);匹配空白字符开头或者空白字符结尾的字符串并且转换成数组

array_values  取得数组中所有的值(而不是键名)
array_diff   取得的是数组的差集(也就是两个数组相比较,其中一个数组比另一个数组多出的部分)

array_diff($new,$old)  和  array_diff($old,$new)是有差别的


上面我们说过了设置时间在id查询单个model的时候的例子
接下来我们在说一下在 GridView::widget中时间的设置
[
    'attribute'=>'update_time',
    'format'=>['date','php:Y-m-d H:i:s'],
],






声明一下GridView::widget的例子:
<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            //这一行就代表的是序列号
           // ['class' => 'yii\grid\SerialColumn'],

//            'id',
            ['attribute'=>'id',
             'contentOptions'=>['width'=>'30px;'],//设置单元格宽度
            ],
            'title',
            //'author_id',
            ['attribute'=>'author_id',
             'value'=>'author.nickname',
            ],
//            'content:ntext',
            'tags:ntext',
//            'status',
            ['attribute'=>'status',
             'value'=>'status0.name',
                //一下这个属性是用来设置下拉查询的样式以及数据交互的查询的
              'filter'=>\common\models\Poststatus::find()
                ->select(['name','id'])//查询这两个字段
                ->orderBy('position')//根据数据库这个字段实现排序
                ->indexBy('id')//用数据库查到的作为索引
                ->column(),//查询列数据
            ],
            // 'create_time:datetime',
//             'update_time:datetime',
            [
                'attribute'=>'update_time',
                'format'=>['date','php:Y-m-d H:i:s'],
            ],


            ['class' => 'yii\grid\ActionColumn'],//这一行代表的是查看、修改、删除
        ],
    ]); ?>




//文章内容太长做截取
[
    'attribute'=>'content',
    'value'=>function($model){
        $tmpStr = strip_tags($model->content);//去掉html的标签
        $tmplength = mb_strlen($tmpStr);//计算长度
        return mb_substr($tmpStr,0,20,'utf-8').(($tmplength>20)?'...':'');//判断长度大于20以后做拼接
    }
],

这样截取直接在代码中写有时候可能太过于繁琐不好维护,那么我们就可以封装类

在model层做一个封装

public function getBeginning(){
$tmpStr = strip_tags($this->content);
$tmpLen = mb_strlen($tmpStr);
return mb_substr($tmpStr,0,20,'utf-8').(($tmpLen)>20?'...':'');
}

接下来就可以在试图层调用了

 [
'attribute'=>'content',
'value'=>'beginning',
// 'value'=>function($model){
// $tmpStr = strip_tags($model->content);//去掉html的标签
// $tmplength = mb_strlen($tmpStr);//计算长度
// return mb_substr($tmpStr,0,20,'utf-8').(($tmplength>20)?'...':'');//判断长度大于20以后做拼接
// }
],

 

 

图文:

 

 

 

 

 


 

 

 

上述错误是字段重复导致的,检查数据表,更换字段,同时更换规则即可!

 

或者在查询的时候指定表名就不用这么大改了:

转载于:https://www.cnblogs.com/zhangfu/p/10336686.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值