1渲染html及赋值过去
a.控制器写个方法
public function actionConsu(){
$hello_str="您好!";
$a=array('很开心','看到你');
//创建一个数组
$data=array();
$data['view_str']=$hello_str;
$data['a_str']=$a;
return$this->render('consu',$data);
}
b.接值及写表单值即将提交的地址及方法
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form= ActiveForm::begin([
'action'=> ['site/consuadd'],
'method'=>'post',
]);
?>
<!doctypehtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>在线咨询</title>
</head>
<body>
<center>
<h2>请输入咨询内容</h2>
<?=$view_str;?>
<?=$a_str[0];?>
<?=$a_str[1];?>
<textareaname="desc"cols="60"rows="10"class="b"></textarea>
<inputtype="submit"value="提交"class="a"/>
<h2class="c"></h2>
</center>
</body>
</html>
2接表单的值。及入库
a.接值处理数据 在顶上要use models
$request= Yii::$app->request;
$a=$request->post('desc');
$test=new Text;
$test->title=$a;
$test->save();
3 展示数据)
a.写个方法(new model、查数据
public functionactionConsulist(){
$text=newText();
$arr=$text->find();
$pages= newPagination([
//'totalCount' => $countQuery->count(),
'totalCount'=> $arr->count(),
'pageSize' =>2 //每页显示条数
]);
$models= $arr->offset($pages->offset)
->limit($pages->limit)
->all();
return$this->render('consulist', [
'models'=> $models,
'pages' =>$pages
]);
b.展示页面
<?php
use yii\widgets\LinkPager;
foreach($modelsas $k=>$v){
echo"<tr>";
echo"<td>".$v['id']."</td>";
echo"<td>".$v['title']."</td>";
echo"<td>".$v['desc']."</td>";
echo"</tr>";
}
echo LinkPager::widget([
'pagination'=> $pages,
]);
?>
4单列删除数据
a处理地址及传值
<td><ahref="index.php?r=site/consudel&id=<?php echo$v['id']?>">删除</a></td>
b//删除咨询
public functionactionConsudel(){
$res=newYii::$app->request;
$id=$res->get('id');
$result=Text::find()->where(['id'=>$id])->all();
$result[0]->delete();
}
5 部分按条件查询
$sql= "select * from text where id= :id";
$results= Text::findBySql($sql,array(':id'=>'1 or 1=1'))->all();
$results=Text::find()->where(['id'=>1])->all();//等于1
$results=Text::find()->where(['>','id',1])->all();//大于1
between>=3和<=5
$results=Text::find()->where(['between','id',3,5])->all();//2和5之间
print_r(count($results));//获取条数
like title'%好孩子% '
$results=Text::find()->where(['like','title','加油'])->all();//2和5之间
$results=Text::find()->where(['>','id',1])->asArray()->all();//大于1结果转化成数组
批量查询
foreach(Text::find()->batch(3)as $texts){
print_r(count($texts));
}
print_r($results);
yii常用 获取登录用户信息
1. 获取控制器名
在控制器中获取控制器名: $this->getId();
在视图中获取控制器名: Yii::app()->controller->id;
2. 获取动作名
在控制器beforeAction()回调函数中获取动作名: $name = $action->id
在其他地方获取动作名:$this->getAction()->getId();
任何地方 Yii::app()->controller->Action->id;
获取当前用户id YII:app()->user->id
判断是否已经登录
if(Yii::$app->user->isGuest){
echo '还没登录,去登录页面';
}else{
echo '已经登录了,去干登录后该干的事';
}
隐藏域
<?=$form->field($model,'pid')->textInput()->hiddenInput(['value'=>$id])?>;
单选框
<?=$form->field($model,'personals')->radioList(['0'=>'个人','1'=>'企业'])?>
获取当前用户名。id
$a= yii::$app->user->identity->username;
$a= yii::$app->user->identity->id;
判断是否已经登录
if(Yii::$app->user->isGuest){
return $this->render('add',['id'=>0]);没登上
}else{
$id= yii::$app->user->identity->id;登上了
return $this->render('add',['id'=>$id]);
}
视图层超链接
<?php useyii\helpers\Url;?>
<li><ahref="<?php echoUrl::to(['home/login']);?>"rel="nofollow">登录</a></li>
Yii2 获取模块名、控制器名、方法名
在视图中:
模块名 $this->context->module->id
控制器名 $this->context->id
方法名 $this->context->action->id
在控制器中
模块名 Yii::$app->controller->module->id;
控制器名 Yii::$app->controller->id
方法名 Yii::$app->controller->action->id;
或
模块名 $this->module->id;
控制器名 $this->id;
方法名 $this->action->id
在控制器的 beforeAction 方法中(方法接收$action参数)
模块名 $action->controller->module->id;
控制器名 $action->controller->id;
方法名 $action->id;
图片上传
最开始的model 在入口文件同级建一个uploads文件夹
<?php
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
class UploadForm extends Model
{
/**
* @varUploadedFile[]
*/
public$imageFiles;
public functionrules()
{
return[
[['imageFiles'],'file','skipOnEmpty'=> false,'extensions'=> 'png, jpg','maxFiles' => 4],
];
}
public functionupload()
{
if($this->validate()) {
foreach($this->imageFilesas $file) {
// $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
$file->saveAs('uploads/'. $file->baseName. '.' .$file->extension);
}
return true;
} else {
return false;
}
}
}
?>
1 渲染页面
public functionactionUpload(){
$model= newUploadForm();
return$this->render('peruseradd''model'=> $model,
]);
}
2 视图层
useyii\widgets\ActiveForm;
<?php$form = ActiveForm::begin([
'action'=> ['per/peradduser'],
'method'=>'post',
'options'=> ['enctype'=> 'multipart/form-data'],
]); ?>
<?=$form->field($model,'imageFiles[]')->fileInput(['multiple'=> true,'accept' => 'image/*'])?>
<?phpActiveForm::end();?>
3控制器上传
public functionactionPeradduser(){
$model= newUploadForm();
if(Yii::$app->request->isPost) {
$imginfo=$model->imageFiles= UploadedFile::getInstances($model,'imageFiles');
// print_r($imginfo);die;
$img_name=$imginfo[0]->name;
$img_path='uploads/'.$img_name;
}
$post= \Yii::$app->request->post();
$list_models= new\app\models\Admin;
$data= ['username'=>$post['username'],
'email'=>$post['email'],
'pwd'=>$post['pwd'],
'timestamp'=>date("Y-m-d H:i:s"),
'img'=>$img_path,
];
$list_models->setAttributes($data);
$list_models->insert();
if($model->upload()) {
$this->redirect('?r=per/peruserlist');
return;
}
}
Ajax传多值及上传
public function actionAddcv()
{
$session = Yii::$app->session;
$id = $session['id'];
$data = $_POST;
$img = $_FILES;
$upload=new UploadedFile(); //实例化上传类
$img=$_FILES['head_img']; //获取上传文件参数
$name = $img['name'];
$upload->tempName=$img['tmp_name']; //设置上传的文件的临时名称
$img_path='uploadss/'.$name; //设置上传文件的路径名称(这里的数据进行入库)
$arr=$upload->saveAs($img_path); //保存文件
$data['uid'] = $id;
$data['add_time'] = time();
$data['head_img'] = $img_path;
$models = new \app\models\Cv;
$num = $models->find()->where(['uid'=>$id])->asArray()->all();
$res = count($num);
if($res>=3)
{
echo 3;
return false;
}
$models->setAttributes($data);
$result = $models->insert();
if($result)
{
echo 1;
}
}
Ajax的
$('#sub').click(function(){
var file = new FormData(document.getElementById('form'));
var url = "?r=cv/addcv";
$.ajax({
url:url,
type:'post',
data:file,
dataType:'json',
processData:false,
contentType:false,
success:function(msg){
if(msg==1)
{
alert('ok')
}
}
});
})
//简单上传
//普通项目上传图片及经验
public functionactionXiangmupu(){
$session= Yii::$app->session;
$data=$_POST;
$data['me_id'] = $session->get('id');
$img=$_FILES['pic'];//获取上传文件参数
$name= $img['name'];
$upload=newUploadedFile();//实例化上传类
$upload->tempName=$img['tmp_name'];//设置上传的文件的临时名称
$img_path='uploads/'.$name;//设置上传文件的路径名称(这里的数据进行入库)
$upload->saveAs($img_path);//保存文件
$data['workpic']=$img_path;
$models= new\app\models\Xiangmudesc();//完善教育信息
$models->setAttributes($data);
$result= $models->insert();
if($result){
echo1;
}else{
echo2;
}
}
//发送邮件
public functionactionEmail(){
$email=$_POST['email'];
$mail= Yii::$app->mailer->compose();
$mail->setTo($email); //接收人邮箱
$mail->setSubject("test");//邮件标题
$mail->setHtmlBody("wo shi chen yan");//发送内容(可写HTML代码)
if($mail->send()){
echo"邮件发送成功";
}else{
echo"邮件发送失败";
}
}
//配置信息
'mailer'=> [
'class'=> 'yii\swiftmailer\Mailer',
'useFileTransport'=> false,
'transport'=> [
'class'=> 'Swift_SmtpTransport',
'host'=> 'smtp.163.com', //每种邮箱的host配置不一样
'username'=> '888888888888888@163.com', //发件人邮箱
'password'=> '188888888888888888888',//授权码
'port'=> '25',
'encryption'=> 'tls',
],
'messageConfig'=>[
'charset'=>'UTF-8',
'from'=>['18888888888888888888888888888881@163.com'=>'chen'] //发件人昵称
],
//我的QQ授权码
//来自小伟
//加入组件
$request=YII::$app->request;
//调用组件里面的方法 接受git传值 第二个参数为默认值
$id=$request->get('id',20);
//调用组件里面的方法 接受post传值 第二个参数为默认值
$id=$request->post('id',20);
//判断是否是git传值
$request->isGet
//判断是否是post传值
$request->isPost
//获取个人iP地址
echo $request->userIP;
//文件下载
$request->headers->add('content-disposition','attachment;filename="a.jpg"');
//文件下载封装函数 默认找web目录下的文件
$request->sendFile('./robots.txt');
//加载session组件
$session=\YII::$app->session;
//开启session
$session->open();
//检查session是否开启 默认没有开启 如果开启则返回真
if($session->isActive){
echo '开启session';
}
//设置session
$session->set('user','张三');
//取出session值
echo $session->get('user');
//取出session值
echo $session->get('user');
//可以使用数组方式存储session
$session['user']='张三';
echo $session['user'];
unset($session['user']);
//删除全部的session
$session->removeAll();
//加载cookie组件
$cookie=\YII::$app->response->cookies;
//设置cookie数据 name value
$cookie_data=array('name'=>'user','value'=>'张三');
//实例化cookie类传入数据
$cookie->add(new Cookie($cookie_data));
//删除cookie
$cookie->remove('user');
//加载请求组件
$cookie=\YII::$app->request->cookies;
//获取cookie的值 第二个参数代表如果没有该cookie的返回值
echo $cookie->getValue('users',20);
//加入响应组件
$res=\YII::$app->response;
//设置statuscode 404
$res->statusCode='404';
//告诉浏览器一旦接受到消息,不用缓存到浏览器里
$res->headers->add('pragma','no-cache');
//告诉浏览器一旦接受到消息,缓存5秒
$res->headers->set('pragma','max-age=5');
//删除
$res->headers->remove('pragma');
//跳转
$this->redirect('https://www.baidu.com',302);
//赋值
$data='啊哈哈';
//展示YII自带样式 //传值
return $this->render('show',array('data'=>$data));
//展示YII自带样式 并且把值放入$content变量当中
return $this->render('show');
//直接输出自己的html页面
return $this->renderPartial('show');
//引入html类
use yii\helpers\Html;
//转译html代码成实体 没有任何意义
<?php echo Html::encode($data); ?>
//引入过滤类
use yii\helpers\HtmlPurifier;
<!--//过滤js代码-->
<?php echo HtmlPurifier::process($data); ?>
//引入自己所定义好的样式
public $layout='commen';
//在视图里面引入第二页面 当然也可以通过第二个参数 向其他视图传值
<!--引入其他视图-->
<?php echo $this->render('shows'); ?>
//创建(替换)数据块 在视图里面
<?php $this->beginBlock('block1'); ?>
<h1>喂喂喂</h1>
<?php $this->endBlock(); ?>
//然后再公共的commen里面使用就会输出内容
<?php
if(isset($this->blocks['block1']))
{
echo $this->blocks['block1'];
}else{
echo '<h1>阿萨达速度</h1>';
}
?>
操作数据库
创建模型
<?php
namespace frontend\models;
use Yii;
use yii\base\Model;
use yii\db\ActiveRecord;
class My_category_major extends ActiveRecord{
}
?>
控制器使用模型
//查看数据库配置信息
$db=Yii::$app->db;
//引入model模型
use frontend\models\My_category_major;
//查询数据
$sql="SELECT * FROM my_category_major";
//该执行会让每条语句变成一组对象然后形成一个数组
$all=My_category_major::findBySql($sql)->all();
//防止sql注入
$id='2';
//查询数据
$sql="SELECT * FROM my_category_major WHERE id=:id";
//该执行会让每条语句变成一组对象然后形成一个数组
$all=My_category_major::findBySql($sql,array(':id'=>$id))->all();
//封装后的函数
查询并且加where条件 id=1
$content=My_category_major::find()->where(array('id'=>1))->all();
//封装后的函数 查询并且加where条件 id>0
$content=My_category_major::find()->where(array('>','id',0))->all();
//封装后的函数 查询并且加where条件 id>=1 并且 id<=2
$content=My_category_major::find()->where(array('between','id',1,2))->all();
//封装后的函数 查询并且加where条件 id like '%1%'
$content=My_category_major::find()->where(array('like','id','1'))->all();
//封装后的函数 查询并且加where条件 讲对象转换成数组
$content=My_category_major::find()->where(array('like','id','1'))->asArray()->all();
//批量查询
foreach(My_category_major::find()->batch(2) as $content){
print_r(count($content));
}
// 获取 country 表的所有行并以 name 排序
//$countries = Country::find()->orderBy('name')->asArray()->all();
// 获取主键为 “US” 的行
$country = Country::findOne('US');
// 输出 “United States”
echo $country->name;
// 修改 name 为 “U.S.A.” 并在数据库中保存更改
$country->name = 'U.S.A.';
$country->save();
//修改
My_nav::updateAll(['nid'=>$nid],$data);
//删除数据
$results=My_category_major::find()->where(['id'=>83])->all();
$results[0]->delete();
//删除数据
My_category_major::deleteAll('id>:id',array(':id'=>83));
//添加数据
$My_category_major=new My_category_major;
$My_category_major->categoryname='我的类';
$My_category_major->save();
加入验证
class My_category_major extends ActiveRecord{
public function rules(){
return [
//验证是否是整型
['id','integer'],
//验证是否是字符串 0-5位的长度
['categoryname','string','length'=>[0,5]]
];
}
}
//添加数据
$My_category_major=new My_category_major;
//设置数据
$My_category_major->categoryname="字符串";
//调用方法 启用rules验证
$My_category_major->validate();
//判断校验是否有错误
if($My_category_major->hasErrors()){
echo "数据不合法";
die;
}
$My_category_major->save();
//修改数据 查询获得一维数组 条件ID=87
$content=My_category_major::find()->where(['id'=>87])->one();
$content->categoryname='张高伟';
$content->save();
//关联查询
创建My_members My_members_log的ActiveRecord
//引入ActiveRecord模型
use frontend\models\My_members;
use frontend\models\My_members_log;
$content=My_members::find()->where(['username'=>'993013863@qq.com'])->one();
//调用关联方法 第一个是表模型 第二个是数组(id相反)
$log=$content->hasMany('frontend\models\My_members_log',['log_uid'=>'uid'])->all();
//优化可以这样写 My_members_log::className() 代替 frontend\models\My_members_log
$log=$content->hasMany(My_members_log::className(),['log_uid'=>'uid'])->asArray()->all();
print_r($log);
class My_members extends ActiveRecord{
//获取日志信息
public function getLog(){
$log=$this->hasMany(My_members_log::className(),['log_uid'=>'uid'])->asArray();
return $log;
}
}
public function actionShows(){
//关联查询
$content=My_members::find()->where(['username'=>'993013863@qq.com'])->one();
//调用关联方法 第一个是表模型 第二个是数组(id相反)
//$log=$content->hasMany('frontend\models\My_members_log',['log_uid'=>'uid'])->asArray()->all();
//$log=$content->hasMany(My_members_log::className(),['log_uid'=>'uid'])->asArray()->all();
//$log=$content->getLog();
//删除缓存
unset($content->log);
$log=$content->log;
print_r($log);
}
hasOne()表示多查一 (自动在后面增加one()方法) hasMany()表示一查多 (自动在后面增加All()方法)
//关联查询 个人
ActiveRecord封装好方法
public function getName(){
return $this->hasOne(My_members::className(),['uid'=>'log_uid'])->asArray();
}
controller里面调用
$content=My_members_log::find()->where(['log_id'=>6])->one();
//避免缓存
unset($content->name);
$name=$content->name;
//分页显示
//引入模型
use app\models\Country;
//引入分页
use yii\data\Pagination;
public function actionIndex()
{
//生成模型的查询
$query = Country::find();
$pagination = new Pagination([
//每页记录条数
'defaultPageSize' => 5,
//全部的计数
'totalCount' => $query->count(),
]);
$countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
}
视图层
<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
<li>
<?= Html::encode("{$country->name} ({$country->code})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>
安全
当创建生成HTML页面的视图时,在显示之前将用户输入数据进行转码和过滤非常重要, 否则,你的应用可能会被跨站脚本 攻击。
要显示纯文本,先调用 yii\helpers\Html::encode() 进行转码,例如如下代码将用户名在显示前先转码:
<?php
use yii\helpers\Html;
?>
<div class="username">
<?= Html::encode($user->name) ?>
</div>
要显示HTML内容,先调用 yii\helpers\HtmlPurifier 过滤内容,例如如下代码将提交内容在显示前先过滤:
<?php
use yii\helpers\HtmlPurifier;
?>
<div class="post">
<?= HtmlPurifier::process($post->text) ?>
</div>
技巧:HTMLPurifier在保证输出数据安全上做的不错,但性能不佳,如果你的应用需要高性能可考虑 缓存 过滤后的结果。
1.简单查询:
[[one()]]: 根据查询结果返回查询的第一条记录。
[[all()]]: 根据查询结果返回所有记录。
[[count()]]: 返回记录的数量。
[[sum()]]: 返回指定列的总数。
[[average()]]: 返回指定列的平均值。
[[min()]]: 返回指定列的最小值。
[[max()]]: 返回指定列的最大值。
[[scalar()]]: 返回查询结果的第一行中的第一列的值。
[[column()]]: 返回查询结果中的第一列的值。
[[exists()]]: 返回一个值,该值指示查询结果是否有数据。
[[where()]]: 添加查询条件
[[with()]]: 该查询应执行的关系列表。
[[indexBy()]]: 根据索引的列的名称查询结果。
[[asArray()]]: 以数组的形式返回每条记录。
应用实例:
Customer::find()->one(); 此方法返回一条数据;
Customer::find()->all(); 此方法返回所有数据;
Customer::find()->count(); 此方法返回记录的数量;
Customer::find()->average(); 此方法返回指定列的平均值;
Customer::find()->min(); 此方法返回指定列的最小值 ;
Customer::find()->max(); 此方法返回指定列的最大值 ;
Customer::find()->scalar(); 此方法返回值的第一行第一列的查询结果;
Customer::find()->column(); 此方法返回查询结果中的第一列的值;
Customer::find()->exists(); 此方法返回一个值指示是否包含查询结果的数据行;
Customer::find()->asArray()->one(); 以数组形式返回一条数据;
Customer::find()->asArray()->all(); 以数组形式返回所有数据;
Customer::find()->where($condition)->asArray()->one(); 根据条件以数组形式返回一条数据;
Customer::find()->where($condition)->asArray()->all(); 根据条件以数组形式返回所有数据;
Customer::find()->where($condition)->asArray()->orderBy('id DESC')->all(); 根据条件以数组形式返回所有数据,并根据ID倒序;
2.关联查询:
[[ActiveRecord::hasOne()]]:返回对应关系的单条记录
[[ActiveRecord::hasMany()]]:返回对应关系的多条记录
应用实例:
//客户表Model:CustomerModel
//订单表Model:OrdersModel
//国家表Model:CountrysModel
//首先要建立表与表之间的关系
//在CustomerModel中添加与订单的关系
Class CustomerModel extends yiidbActiveRecord
{
...
public function getOrders()
{
//客户和订单是一对多的关系所以用hasMany
//此处OrdersModel在CustomerModel顶部别忘了加对应的命名空间
//id对应的是OrdersModel的id字段,order_id对应CustomerModel的order_id字段
return $this->hasMany(OrdersModel::className(), ['id'=>'order_id']);
}
public function getCountry()
{
//客户和国家是一对一的关系所以用hasOne
return $this->hasOne(CountrysModel::className(), ['id'=>'Country_id']);
}
....
}
// 查询客户与他们的订单和国家
CustomerModel::find()->with('orders', 'country')->all();
// 查询客户与他们的订单和订单的发货地址
CustomerModel::find()->with('orders.address')->all();
// 查询客户与他们的国家和状态为1的订单
CustomerModel::find()->with([
'orders' => function ($query) {
$query->andWhere('status = 1');
},
'country',
])->all();
注:with中的orders对应getOrders
常见问题:
1.在查询时加了->select();如下,要加上order_id,即关联的字段(比如:order_id)比如要在select中,否则会报错:undefined index order_id
// 查询客户与他们的订单和国家
CustomerModel::find()->select('order_id')->with('orders', 'country')->all();
findOne()和findAll():
// 查询key值为10的客户
$customer = Customer::findOne(10);
$customer = Customer::find()->where(['id' => 10])->one();
// 查询年龄为30,状态值为1的客户
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
// 查询key值为10的所有客户
$customers = Customer::findAll(10);
$customers = Customer::find()->where(['id' => 10])->all();
// 查询key值为10,11,12的客户
$customers = Customer::findAll([10, 11, 12]);
$customers = Customer::find()->where(['id' => [10, 11, 12]])->all();
// 查询年龄为30,状态值为1的所有客户
$customers = Customer::findAll(['age' => 30, 'status' => 1]);
$customers = Customer::find()->where(['age' => 30, 'status' => 1])->all();
where()条件:
$customers = Customer::find()->where($cond)->all();
$cond写法举例:
// SQL: (type = 1) AND (status = 2).
$cond = ['type' => 1, 'status' => 2]
// SQL:(id IN (1, 2, 3)) AND (status = 2)
$cond = ['id' => [1, 2, 3], 'status' => 2]
//SQL:status IS NULL
$cond = ['status' => null]
[[and]]:将不同的条件组合在一起,用法举例:
//SQL:`id=1 AND id=2`
$cond = ['and', 'id=1', 'id=2']
//SQL:`type=1 AND (id=1 OR id=2)`
$cond = ['and', 'type=1', ['or', 'id=1', 'id=2']]
[[or]]:
//SQL:`(type IN (7, 8, 9) OR (id IN (1, 2, 3)))`
$cond = ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]
[[not]]:
//SQL:`NOT (attribute IS NULL)`
$cond = ['not', ['attribute' => null]]
[[between]]: not between 用法相同
//SQL:`id BETWEEN 1 AND 10`
$cond = ['between', 'id', 1, 10]
[[in]]: not in 用法类似
//SQL:`id IN (1, 2, 3)`
$cond = ['in', 'id', [1, 2, 3]]
//IN条件也适用于多字段
$cond = ['in', ['id', 'name'], [['id' => 1, 'name' => 'foo'], ['id' => 2, 'name' => 'bar']]]
//也适用于内嵌sql语句
$cond = ['in', 'user_id', (new Query())->select('id')->from('users')->where(['active' => 1])]
[[like]]:
//SQL:`name LIKE '%tester%'`
$cond = ['like', 'name', 'tester']
//SQL:`name LIKE '%test%' AND name LIKE '%sample%'`
$cond = ['like', 'name', ['test', 'sample']]
//SQL:`name LIKE '%tester'`
$cond = ['like', 'name', '%tester', false]
[[exists]]: not exists用法类似
//SQL:EXISTS (SELECT "id" FROM "users" WHERE "active"=1)
$cond = ['exists', (new Query())->select('id')->from('users')->where(['active' => 1])]
此外,您可以指定任意运算符如下
//SQL:`id >= 10`
$cond = ['>=', 'id', 10]
//SQL:`id != 10`
$cond = ['!=', 'id', 10]
常用查询:
// WHERE admin_id >= 10 LIMIT 0,10
User::find()->select('*')->where(['>=', 'admin_id', 10])->offset(0)->limit(10)->all()
// SELECT `id`, (SELECT COUNT(*) FROM `user`) AS `count` FROM `post`
$subQuery = (new Query())->select('COUNT(*)')->from('user');
$query = (new Query())->select(['id', 'count' => $subQuery])->from('post');
// SELECT DISTINCT `user_id` ...
User::find()->select('user_id')->distinct();
更新:
//update();
//runValidation boolen 是否通过validate()校验字段 默认为true
//attributeNames array 需要更新的字段
$model->update($runValidation , $attributeNames);
//updateAll();
//update customer set status = 1 where status = 2
Customer::updateAll(['status' => 1], 'status = 2');
//update customer set status = 1 where status = 2 and uid = 1;
Customer::updateAll(['status' => 1], ['status'=> '2','uid'=>'1']);
删除:
$model = Customer::findOne($id);
$model->delete();
$model->deleteAll(['id'=>1]);
批量插入:
Yii::$app->db->createCommand()->batchInsert(UserModel::tableName(), ['user_id','username'], [
['1','test1'],
['2','test2'],
['3','test3'],
])->execute();
查看执行sql
//UserModel
$query = UserModel::find()->where(['status'=>1]);
echo $query->createCommand()->getRawSql();