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.');
}
}
}
?>