1. 程式人生 > >Yii2幾個要註意的小地方

Yii2幾個要註意的小地方

address 收信 find hasone pre 必須 uname 問題 設置

本人新手, 剛接觸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幾個要註意的小地方