原文: 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;}elsereturn 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,CF3 王五 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的信息数组
}