• 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 yiidbTransaction;
    $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' => 'yiicachingFileCache'
    
            ],
    
            '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('字段')

  • 相关阅读:
    洛谷.4717.[模板]快速沃尔什变换(FWT)
    BZOJ.4589.Hard Nim(FWT)
    BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
    BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)
    Vijos.lxhgww的奇思妙想(k级祖先 长链剖分)
    Codeforces.741D.Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree 思路)
    Codeforces.600E.Lomsat gelral(dsu on tree)
    11.7 NOIP模拟赛
    11.5 正睿停课训练 Day16
    Maven与Nexus3.x环境构建详解
  • 原文地址:https://www.cnblogs.com/lz0925/p/7687617.html
Copyright © 2020-2023  润新知