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幾個要註意的小地方