Yii2几个要注意的小地方
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2几个要注意的小地方相关的知识,希望对你有一定的参考价值。
本人新手, 刚接触Yii, 记录下遇到的坑, 大神请绕道/
1.
//插入数据到数据库, 需要 new 一下,设置属性;
$info = new BasicInfo();
$info -> setAttributes($data);
new 之后 这里 $data 就可以是一个数组
但如果是更新数据的话(不new), 只能一个一个压入数据. //如果不对的话, 请吐槽, 必须吐槽!~
$info = BasicInfo::findOne($data[‘id‘]); if($data == $info[‘attributes‘]) { $this->setError(‘未更改任何信息!‘); return false; } $info -> phone = $data[‘phone‘]; $info -> email = $data[‘email‘]; $info -> address = $data[‘address‘]; $info -> work_time = $data[‘work_time‘];
这里顺道说一下 $res->save(false) 中的false 参数, 关闭数据库的验证, 貌似实在model中的验证规则,
if(!$res->save(false)) { $this->setError($res->getErrors()); return false; }
2. 关于数据库连贯操作 ->asArray(); 可以加参数true, 但是加不加有什么区别?
asArray() 只能在model的查询中使用, 很多时候还是建议大家加上asAaary(), 不然特别是列表的时候. 容易报错
我曾经因为这个弱智问题纠结了半天.//../
3. 从来没想过 like 竟然可以多个连起来用
Yii 用sql的原生语句, 关于多个like 查询, 但在sql中{$like}要用( ) 包起来, 否则会有bug, 为什么? 我也不知道
$like = ‘‘; for($i=0;$i<$num;$i++) { $like .= "label LIKE ‘%{$label[$i]}%‘ OR "; } $like = rtrim($like,‘OR ‘); $sql = "SELECT article_id,title,summary,create_time From articles WHERE status=1 and article_id!={$article_id} and ({$like}) ORDER BY create_time DESC limit 2"; $Article = \Yii::$app->dbofficial ->createCommand($sql) ->queryAll(); //查询用query, 其他用execute
4. 用select别名, 只需要在model文件中把想用的别名设置为public属性/
比如select(‘goods_id as gid‘) 去model中设置 public $gid, 就可以用了
貌似必须用->asArraay() 这个连贯操作, 不然会报错.
5. joinwith 联查实例
$artList = Article::find()->joinWith(‘user‘,false)->select(‘article_id,articles.create_time,title,name as uname‘)->where([‘articles.status‘=>1])->orderBy(‘articles.create_time DESC‘)->asArray();
想要上面的代码生效, 你需要去Article的model中添加如下代码, 告诉系统两者之间的关系,
public function getUser()
{
return $this->hasOne(User::className(), [‘id‘ => ‘user_id‘]);
}
看下面
->joinWith(‘user‘,false)
这里如果你忘了加 false参数, 那么你可能跟我一样傻逼半个钟头, 虽然查出来的数据都对, 但是有个子数组, 看着很恶心, 如果键名重复, 查询结果还会受到影响
6.
事务 use yii\db\Transaction; $connection = \Yii::$app->dbofficial; $img -> status = 0; $transaction = $connection->beginTransaction(); try { $img->save(); $res->save(); $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); return false; } return true; 事务结束
7. 一些sql 语句
SQL可以使用IF(value,t,f) 语句, 例如if(salary>2000,‘high‘,‘low‘) //工资大于2000是high, 低于2000是low User::find()->where([‘name‘ => ‘小伙儿‘])->all(); 此方法返回 [‘name‘ => ‘小伙儿‘] 的所有数据; Usermodel->find()->where(["like","字段名","查询值"])->one(); 模糊查询 User::find()->orderBy(‘id DESC‘)->all(); 此方法是排序查询; User::findBySql(‘SELECT * FROM user‘)->all(); 此方法是用 sql 语句查询 user 表里面的所有数据; User::find()->select(‘id,name‘)->where("status=1")->all(); //此方法为Yii2 查询指定字段 Customer::find()->where($condition)->asArray()->orderBy(‘id DESC‘)->all(); 根据条件以数组形式返回所有数据,并根据ID倒序; User::findBySql(‘SELECT id,name FROM user‘)->one(); //此方法是用 sql 语句查询 user 表里面的一条数据; findOne()->getAttribute(‘字段‘)
时间戳格式化: Yii::$app->formatter->asDate(); Yii::$app->formatter->asDateTime(); 设置默认时区配置文件里第三行 return [ ‘charset‘ => ‘utf-8‘, ‘language‘ => ‘zh-CN‘, ‘timeZone‘ => ‘Asia/Shanghai‘, //看这里 ‘components‘ => [ ‘cache‘ => [ ‘class‘ => ‘yii\caching\FileCache‘ ], ‘formatter‘ => [ ‘dateFormat‘ => ‘yyyy-MM-dd‘, ‘timeFormat‘ => ‘HH:mm:ss‘, ‘datetimeFormat‘ => ‘yyyy-MM-dd HH:mm:ss‘ ] ] ];
跨域问题
header(‘Access-Control-Allow-Origin:*‘); 跨域放在接口的index
查看接口输出
file_put_contents(‘D:/test.txt‘, print_r($data,true)); // 输出到文件中, 查看API的接收信息
SQL可以使用IF(value,t,f) 语句, 例如if(salary>2000,‘high‘,‘low‘) //工资大于2000是high, 低于2000是low
User::find()->where([‘name‘ => ‘小伙儿‘])->all(); 此方法返回 [‘name‘ => ‘小伙儿‘] 的所有数据;
Usermodel->find()->where(["like","字段名","查询值"])->one(); 模糊查询
User::find()->orderBy(‘id DESC‘)->all(); 此方法是排序查询;
User::findBySql(‘SELECT * FROM user‘)->all(); 此方法是用 sql 语句查询 user 表里面的所有数据;
User::find()->select(‘id,name‘)->where("status=1")->all(); //此方法为Yii2 查询指定字段 Customer::find()->where($condition)->asArray()->orderBy(‘id DESC‘)->all(); 根据条件以数组形式返回所有数据,并根据ID倒序;
User::findBySql(‘SELECT id,name FROM user‘)->one(); //此方法是用 sql 语句查询 user 表里面的一条数据;
findOne()->getAttribute(‘字段‘)
以上是关于Yii2几个要注意的小地方的主要内容,如果未能解决你的问题,请参考以下文章