Yii2.0+之开发笔记

1、AR模式去掉自动排序功能

public function search($params)
{
$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'sort' => false,    // 去掉自动排序功能
]);

2、标量查询

Book模型对应的表为 book ,$bookId的参数值为1

Book::find()->select('title')->where(['id' => $bookId])->scalar();

生成 SQL:

SELECT `title` FROM `book` WHERE `id` = 1

直接输出 title 的值

如果 select('title') 不写的话,
生成 SQL:

SELECT * FROM `book` WHERE `id`=1

直接输出 id 的值

3、获取当前Controller name和action name和modules

modules模块下books

class BookController extends BaseController
{
    public function actionIndex()
    {
        echo $this->id;
        echo "<pre>";
        echo $this->action->id;
        echo "<pre>";
        echo $this->module->id;//控制器获取当前模块 modules
        echo "<pre>";
    }
}

直接输出:
book
index
books

4、不生成label标签

// ActiveForm类
$form->field($model, 'title')->textInput(['maxlength' => true])->label(false); 

5、防止 SQL 和 Script 注入:

use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
echo Html::encode($view); //可以原样显示<script></script>代码
echo HtmlPurifier::process($view); //可以过滤掉<script></script>代码

6、AND、OR、大于、小于、不等于、等于、LIKE、IN 查询

  $bookArr = Book::find()->select('title')
            ->where(['status'=>1])
            ->andWhere(['or',['type'=>2],['type'=>3]]) //OR
            //->where(['and', 'status=1', ['or', 'type=2', 'type=3']]) //AND、OR 等价于前2个条件组合
            ->andWhere(['status' => 1,'del_flag' => 0]) //等于
            ->andWhere(['<>','type',1]) //不等于
            ->andWhere(['>=', 'create_time', date('Y-m-d H:i:s', time())]) //大于等于
            ->andWhere(['<=', 'create_time', date('Y-m-d H:i:s', time())]) //小于等于
            ->andWhere(['like', 'title', '道德经']) //LIKE
            ->andWhere(['in', 'type', [1,2]]) //IN
            ->asArray()
            ->orderBy("id DESC")
            ->all();

7、有两种方式获取查询出来的 title 为数组的集合

方式一:

 return \yii\helpers\ArrayHelper::getColumn(Book::find()->where(["category_id"=>1])->all(), 'title');

方式二:

return Book::find()->where(["category_id"=>1])->select('title')->asArray()->column();

8、搜索的时候添加条件筛选

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
// $dataProvider->query->andWhere(['cid' => 0]);
$dataProvider->query->andWhere(['>', 'cid', 0]);
//可选
$dataProvider->query->andFilterWhere(['id'=>isset($bookId)?$bookId:null]);

9、表单验证去掉首尾空格

public function rules()
{
  return [['title', 'content'],'trim']];
}

10、LIKE 查询 单边加 %

['LIKE', 'title', '狼道'] 会生成 title LIKE '%狼道%'
['LIKE', 'title', '%狼道', false] => title LIKE '%狼道'
['LIKE', 'title', '狼道%', false] => title LIKE '狼道%'

11、事务等价变换

Yii::$app->db->transaction(function () {
  $bookOrder = new BookOrder();
  $bookOrder->save();
});
//等价于
$transaction = Yii::$app->db->beginTransaction();
try {
  $bookOrder = new BookOrder();
  $bookOrder->save();
  $transaction->commit();
} catch (\Exception $e) {
  $transaction->rollBack();
  throw $e;
}

12、批量插入数据

方式一:

$model = new Book();
foreach ($data as $attributes) {
  $_model = clone $model;
  $_model->setAttributes($attributes);
  $_model->save();
}

方式二:

$model = new Book();
foreach ($data as $attributes) {
  $model->isNewRecord = true;
  $model->setAttributes($attributes);
  $model->save() && $model->id = 0;
}

13、框架Model的save(false)使用

model类的RULES规则中,若对非数据表字段内容做了安全检查,一般调用model的save()方法时会报错,此时需要给save()方法增加参数false

$model = new Book();
$model->title = '羊皮卷';
$model->username = '王重阳';//假设book对应的数据表中不存在此字段
$model->save(false);//若无false参数,则会保存失败

14、 DetailView小部件

DetailView 用来显示一条记录的详情,以下为一条记录的情况:
1、一个Model模型类对象的数据
2、ActiveRecord 类的一个实例对象
3、由键值对构成的一个关联数组

DetailView::widget([         // 调用 DetailView::widget() 方法
        'model' => $model,           // model 这里可以是一个模型类的实例,也可以是一个数组
        'attributes' => [            // attributes 属性决定显示模型的那些属性以及如何格式化
            'id',
            [
                'attribute' => 'uid',// 更常用的展示管理表字段的方式
                'format' => 'raw',
                'value' => \backend\modules\books\models\User::getUserName($model->uid)
            ],
            'title',
            'sort',
            'create_time',
            'update_time',
            [
                'attribute' => 'del_flag',
                'value' =>$model->del_flag==1?'已删除':'未删除',
            ],
        ],
        // 'template' 属性调整表格每一行的样式
        'template' => '<tr><th style="width: 120px;">{label}</th><td>{value}</td></tr>',
        //  'options' 属性调整真个 table 的样式
        'options' => ['class' => 'table table-striped table-bordered detail-view'],        
    ]) 

User模型中方法getUserName

//获取用户姓名
public static function getUserName($uid){
    if($uid>0){
        $username = User::find()->select("username")
                    ->where(['del_flag'=>0,'uid'=>$uid])
                    ->orderBy("id DESC")
                    ->scalar();
        return $username;
    }else{
        return "";
    }
}

15、URL操作整理

//获取url中的host信息
Yii::$app->request->getHostInfo();
    
//获取url中的路径信息(不包含host和参数):
Yii::$app->request->getPathInfo();

//获取不包含host信息的url(含参数):
# /public/index.php?r=news&id=1;
Yii::$app->request->url;
//或
Yii::$app->request->requestUri;

//只想获取url中的参数部分
# r=news&id=1
Yii::$app->getRequest()->queryString;

//获取某个参数的值,比如id
Yii::$app->getRequest()->getQuery('id'); //get parameter 'id'
    
//获取(除域名外的)首页地址
# /public/index.php
Yii::$app->user->returnUrl;

//获取Referer
Yii::$app->request->headers['Referer'];
//或
Yii::$app->getRequest()->getReferrer();

16、GridView展示之批量排序功能

<?php
GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
	['class' => 'yii\grid\SerialColumn','header'=>'编号'],
	[
		'attribute' => 'cover',
		'format' => [
			'image',//图片显示样式
			[
				'width'=>'100',
				'height'=>'100'
			]
		],
		'value' => function ($model) {
		//图片URL地址 如:https://g.csdnimg.cn/static/user-reg-year/1x/3.png
			return $model->cover;
		}
	],
	[
		'attribute' => 'title',
		'label' => '标题',
		'contentOptions' => [
		'style' => 'white-space: normal;', 
		'width' => '20%'
		],
	],
	[
		'attribute' => 'subtitle',
		'label' => '副标题',
		'contentOptions' => [
		'style' => 'white-space: normal;', 
		'width' => '20%'
		],
	],
	[
		'attribute' => 'is_try',
		'label' => '书籍类型',
		'value' => function ($model) {//标签设置样式
			if($model->price == 0) {
				$options = ['style' => ['color' => '#0000cc']];
				return Html::tag('span','体验书籍',$options);
			}else {
				$options = ['style' => ['color' => '#A60000']];
				return Html::tag('span','收费书籍',$options);
			}
		},
		'format' => 'raw'
	],
	[
		'label' => '排序',
		'format' => 'raw',
		'value' => function ($model) {//批量修改排序
			return Html::textInput('sort[]',$model->sort, [
				'class'=>'form-control form-input',
				'id' => $model->id,
				'value' => $model->sort,
				'style' => 'width:60px'
			]);
		}
	],
	[
			'attribute'=>'status',
			'label'=>'状态',
			'value'=>function($model) {
				 return $model->status==1?'上架':'下架';
			}
	],
	[
		'class' => 'yii\grid\ActionColumn',
		'header' => '操作',
		'options' => ['width' => '100px;'],
		'template' => '  {off} <br> {view}  {update}  {delete}',
		'buttons' => [
			'off' => function ($url, $model) {
				$url = Yii::$app->request->url;
				$action =  explode('/',$url);
				if($model->status == 1) {
					return Html::button(
						'<i class="fa fa-remove">下架</i>', 
						['id' => $model->id,'action'=>$action[3],
						'class' => 'book del btn btn-warning btn-xs']
					);
				}else {
					return Html::button(
						'<i class="glyphicon glyphicon-ok">上架</i>',  
						['id' => $model->id,'action'=>$action[3],
						'class' => 'book del btn btn-warning btn-xs']
					);
				}
			},
			'view' => function ($url, $model) {
				$url = Yii::$app->request->url;
				$action =  explode('/',$url);
				return Html::a(
					'<i class="fa fa-edit">查看</i>', 
					['book/view','id'=>$model->id,'action'=>$action[3]], 
					[
						'title' => Yii::t('app', 'view'),
						'class' => 'del btn btn-primary btn-xs',
					]
				);
			},
			'update' => function ($url, $model) {
				$url = Yii::$app->request->url;
				$action =  explode('/',$url);
				return Html::a(
					'<i class="fa fa-unlock-alt">更新</i>', 
					['book/update','id'=>$model->id,'action'=>$action[3]], 
					[
						'title' => Yii::t('app', 'update'),
						'class' => 'del btn btn-success btn-xs',
					]
				);
			},
			'delete' => function ($url, $model) {
				$url = Yii::$app->request->url;
				$action =  explode('/',$url);
				return Html::a(
					'<i class="fa fa-close">删除</i>',  
					['book/delete','id'=>$model->id,'action'=>$action[3]], 
					[
						'title' => Yii::t('app', 'delete'),
						'class' => 'del btn btn-default btn-xs',
						'data' => [
							'confirm' => Yii::t(
								'app', 
								'Are you sure you want to delete this item?'
							),
							'method' => 'post',
						],
					]
				);
			},
		],
	],
],
]); 
?>
<?=Html::button('更改排序',['class' => 'btn btn-info btn-sm batch-sort']) ?>
<script language="JavaScript">
    $(function () {
        //上下架功能
        $('.book').click(function () {
            var id = $(this).attr('id'),
                action = $(this).attr('action'),
                layer = top.layer;
            var params = {
                id : id,
                action : action
            };
            var index = layer.confirm('您确定要执行此操作吗?', {
                btn: ['确定','取消']
            }, function(){
                var params = {
                    id : id
                };
                $.post('off',params,function (data) {
                    if(data.code == 0) {
                        layer.close(index);
                        layer.alert(data.msg);
                        window.location = window.location.href;
                    }
                },'JSON');
            }, function(){
                layer.close(index);
            });
        });
        //批量更改排序
        $('.batch-sort').click(function () {
            var params = {};
            $('input[name="sort[]"]').each(function () {
                params[$(this).attr('id')] = $(this).val();
            });
            $.post(
				'<?=Yii::$app->urlManager->createUrl('books/book/batch-sort');?>',
				params,
				function (data) {
					if(data.code == 0) {
						alert('操作成功');
						window.location.href = window.location;
					}else {
						alert(data.msg);
					}
				},
				'JSON'
			);
        });
    });
</script>
<?php
namespace backend\modules\books\controllers;
class BookController extends BaseController
{
	/**
     * 下架/下架
     */
    public function actionOff()
    {
    	if(Yii::$app->request->isPost) {
    		//检测是否登录
			$user = Yii::$app->getUser();
			if(!$user) {
				return json_encode(['code' => 1,'msg' => '请先登录!'],256);
			}
    		$post = Yii::$app->request->post();
			$off = $this->findModel($post['id']);
			if ($off->status == 1) {
				$off->status = 0;
				$off->off_shelf_time = date('Y-m-d H:s:i',time());
			} else {
				$off->status = 1;
				$off->on_shelf_time = date('Y-m-d H:s:i',time());
			}
			$off->save();
			return json_encode(['code' => 0,'msg' => '操作成功'],256);
		}
    }
	
	/**
	 * 批量更改排序
	 */
	public function actionBatchSort() {
		if(Yii::$app->request->isPost){
			$post = Yii::$app->request->post();
			try {
				foreach ($post as $key => $val) {
					Book::updateAll(['sort' => $val],'id='.$key);
				}
				return json_encode(['code' => 0,'msg' => '操作成功']);
			}catch (\Exception $e) {
				var_dump($e->getMessage());
			}
		}
	}
	/**
	  * 根据当前ID查询
	  */
	protected function findModel($id)
    {
        if (($model = Book::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested does not exist.');
        }
    }
}
?>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值