yii的学习过程(Model的创建和应用)
继续我们的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 appmodels;
use yiiaseModel;
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 appmodels;
user yiiaseModel;
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 appmodels;
use yiidbActiveRecord;
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的信息数组
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Unity 发布到IOS,Android的各种坑
- 下一篇: 页面的各种高度和宽度获取