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('字段')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM