yii的学习过程(Model的创建和应用)

原文: https://blog.csdn.net/xyz_dream/article/details/56316458

继续我们的yii2学习之旅! 这次主要讲的是yii2Model的创建和应用,关于数据库的操作,表单验证,文件上传等等。

1.表单Model与验证和文件上传

1.1 表单填充和验证

yii2里面大致常用的分为两种Model.第一种就是表单model,第二种是连接数据库的model。首先先介绍表单model的使用。

新建一个表单如下:

   <form action=<?=create_url(‘form/do’)?>method=“post” enctype=“multipart/form-data”>
<input name=“_csrf” type=“hidden” id=“_csrf” value=<?=\Yii::$app->request->csrfToken ?>>
用户名:<input type=“text” name=“Form[username]” /><br/><br/>
密码:<input type=“password” name=“Form[password]”/><br/><br/>
邮箱地址:<input type=“text” name=“Form[email]”/><br/><br/>

    <input type=“submit” value=提交> <input type=“reset” value=重置/>
</form>
  
    在model文件夹中新建一个名为Form.php的文件:
    namespace app\models;
    use yii\base\Model;
    class Form extends Model
    {
       public $username;//用户名
       public $password;//密码
       public email;//邮箱地址
        //字段映射到自己定义的错误提示字段
       public function attributeLabels()
       {
         return [
           “username”=>”用户名”,
           “password”=>”密码”,
           “email”=>”邮箱”
          ];
       } 
     //字段规则  
       public function rules()
       {
          return [
                       //3个字段必须填写      
          [[“username”,”password”,”email”],”required”,”{attribute必填}”],
                        //username为字符串  长度 6-9 小于 6 提示少于6字符 大于9 错误信息为大于9
          [“username”,”string”,”length”=>[6,9],”tooShort”=>”{attribute}少于6个字符”,
           “tooLong”=>”{attribute}大于9个字符”],
          [“passowrd”,”string”,”length”=>[6,16]],
                     //验证邮箱格式   提示错误信息   格式不正确
          [“email”,”email”,”message”=>”{attribute}格式不正确”]        
        ];
       }
    }
    
     新建一个FormController.php actionDo方法处理此表单。我们可以看出,表单字段名必须是Model[字段名],
例如上面的Form[username] ,按照这样的写法才能适应yii2的验证功能和填充表单的功能。
      public function actionDo()
     {
           $user=new Form();
                  //填充数据 传入post的数组          并且  调用验证方法 validate 通过
           if($user->load(\Yii::$app->request->post())&&$user->validate())
           {
                     //做有意义的事…….
           }else{
                if($this->hasError())//有错误,没通过表单验证
               {
                   $errorArray=$user->getError();//错误信息数组
                   var_dump($errorArray);//打印出错误数组信息
                    //可以弹出错误然后 die(错误信息)…….
                }
           }
     }
 
     1.2 文件上传 

      model下面新建一个UploadFile.php文件:
      namespace app\models;
      user yii\base\Model;
      class UploadFile extends Model
      {
           public $file;//用于接收上传文件对象

          public function rules()
         {
            //继承model也可以使用验证器
         }

        public function upload()
        {
          if($this->file->saveAs(“/upload/“.$this->file->baseName.’.’.$this->file->extension))
          {
            return true;
          }else
           return false;

        }

      }

      上传文件表单规则:具备发送 _csrf 字段和 表单名为 UploadFile[file] !

      下面的方法中进行测试:

       public function actionUp()
       {
           $uploadFile=new UploadFile();
          $uploadFile->file=UploadedFile::getInstance($uploadFile,”file”);//yii2内置上传文件类
           $uploadFile->upload();//执行上传文件功能
       }


       关于第一种model就说到这里,具体的大家可以参考官方文档>核心验证器以及权威yii类参考手册,参考验证类
的使用方法!
   
 2.关于数据库的Model
       前面讲过了db.php配置过了数据库的信息。现在新建3个文件,User.php,UserGame.php,Game.php,以及在mysql
数据库中存在这么3张表。
      user(用户表,id,name) user_game(用户_游戏记录中间表,id,uid,gid) game(游戏列表)具有的信息
如下:         1   张三                          1,1,1                1,英雄联盟
             2   李四                          2,1,2                 2,CF
             3   王五                          3,2,1 
      表达的意思是 张三玩了两款游戏,分别是 英雄联盟和CF ,李四只玩了英雄联盟,王五则什么都没玩。
   2.1 单表查询 
      User.php举例: 
      namespace app\models;
      use yii\db\ActiveRecord;
      class User extends ActiveRecord
      {
      
        //此方法指明数据库表名,默认情况下可以不写,yii2通过model类名作为表名
         public function tableName()
        {
            return “user”;
        }
      }
      
      先大致这样就行了。后面我们再说多表查询。新建一个DbController.php  actionHello()方法测试代码
     
     public function actionHello()
     {
          //1.通过主键查询到User对象
         $user=User::findOne(1);//查出张三这个对象的信息(object)
         $user=User::findOne(1)->asArray();//把得到的对象转换为数组的形式
         //2.通过原生sql语句查询数据
           $id=20;
          $sql=”select *form user where id=:id”;//参数绑定    安全问题
          $users=User::findBySql($sql,[“:id”=>$id]);
        //3.插入数据
         $user=new User();
         $user->name=”我是新来的”;
           $user->save(); //即可插入数据库
       //4.查询数据 user表 id=1 的一个对象 转换为数组形式 
        $user=User::find()->where([“id”=>1])->asArray()->one();
       //4.1查询数据 user表 id>=1 && <=3 的所有对象 转换为数组形式
           $users=User::find()->where([“between”,”id”,1,3])->asArray()->all();
        //4.2等价于下面用到的 andWhere()(相应的还有orWhere的用法一样)
      $users=User::find()->andWhere([“>=”,”id”,1])->andWhere([“<=”,”id”,3])->asArray()->all();
         //4.3 like查询  查询到张三
          $user=User::find()->where([“like”,”name”,”张%”])->asArray()->all();
     }
      //大致的常用单表查询就这么多,其余剩下的一些用法,大家请参考yii2手册查询更详细的用法。
   
  2.2多表查询
       还是User进行举例,其余两个表大家同样按照User.php创建好。  
       在User类中添加一个方法,通过用户id查询游戏记录。
        //1:多 的查询方式(hasMany())
        public function getUserGameById()
       {
            $records=this->hasMany(UserGame::className(),[“uid”=>”id”])->asArray()->all();
          return $records;
       }
       //2.多:多 的查询方式(viaTable()) 也就是通过 user的id查询他玩的游戏的名称

       public function getGameNameById()
       {
         $games=$this->hasMany(Game::className(),[“id”=>”gid”])->viaTable(“user_game”,[“uid”=>”id”])->asArray()->all();
         
        return $games;
       }
       //3.多:1的查询 (hasOne())  此时我们在UserGame类中添加下列方法,通过记录id查询到所属哪user的信息

       public function getUserById()
       {
         $user=$this->hasOne(User::className(),[“id”=>”uid”]);
         return $user;
       }
  
       下面我们在Dbcontroller的actionIndex方法中测试:

        public function actionIndex()
       {
          //1:多查询
         $user=new User();
         $user->id=1;
         $result=$this->getUserGameById();//此时会得到两条 张三的记录 为数组形式的数据

         //多:多
         $games=$user->getGameNameById(); //此时会得到两条 张三 所玩游戏名称和游戏id 

         //多:1

         $userGame=new UserGame();
          $userGame->id=1;
         $user=$userGame->getUserById();//通过 游戏记录为id=1查询到所属user的信息数组
     
       }