yii2 模型
Yii2的模型(Model)是MVC(Model-View-Controller)设计模式中的一部分,它代表业务数据、规则和逻辑的对象。模型通常用于处理与数据相关的业务逻辑,如数据的验证、访问和修改等。
模型示例代码
<?php
namespace app\models;
use Yii;
use yii\db\ActiveRecord;
/**
* User模型
*
* @property int $id
* @property string $username
* @property string $email
* @property string $password_hash
*/
class User extends ActiveRecord
{
/**
* 返回与这个类关联的数据库表名
*
* @return string
*/
public static function tableName()
{
return 'user'; // 对应的数据库表名
}
/**
* 返回此模型的属性标签
*
* @return array
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'username' => '用户名',
'email' => '邮箱',
'password_hash' => '密码',
];
}
/**
* 验证规则
*
* @return array
*/
public function rules()
{
return [
[['username', 'email', 'password_hash'], 'required'],
['email', 'email'],
['username', 'unique', 'targetClass' => '\app\models\User', 'message' => '该用户名已存在。'],
// 其他验证规则...
];
}
/**
* 在保存之前,密码需要被哈希处理
*
* @return bool
*/
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if (!$this->isNewRecord) {
$this->password_hash = Yii::$app->security->generatePasswordHash($this->password_hash);
}
return true;
}
return false;
}
// ... 其他模型方法,如自定义查询方法、关联定义等
}
操作模型
创建记录
// 查找一个用户
$user = User::findOne($id);
// 创建一个新用户
$newUser = new User();
$newUser->username = 'example';
$newUser->email = '[email protected]';
$newUser->password_hash = Yii::$app->security->generatePasswordHash('password123');
$newUser->save(); // 保存用户到数据库
// 验证模型数据
if ($newUser->load(Yii::$app->request->post()) && $newUser->save()) {
// 保存成功
} else {
// 验证失败,显示错误信息
}
读取记录
// 读取单个记录
$user = User::findOne(1); // 通过主键ID读取
if ($user) {
echo $user->name;
} else {
echo 'User not found.';
}
// 读取多个记录
$users = User::find()->all(); // 读取所有用户
foreach ($users as $user) {
echo $user->name . '<br>';
}
// 根据条件读取记录
$users = User::find()
->where(['status' => 'active'])
->orderBy('created_at DESC')
->limit(10)
->all();
更新记录
// 加载要更新的记录
$user = User::findOne(1);
if ($user) {
$user->name = 'New Name';
$user->email = '[email protected]';
// 保存更新到数据库
if ($user->save()) {
echo 'User updated successfully!';
} else {
echo 'Failed to update user.';
}
} else {
echo 'User not found.';
}
删除记录
// 删除指定ID的用户
$user = User::findOne(1);
if ($user) {
if ($user->delete()) {
echo 'User deleted successfully!';
} else {
echo 'Failed to delete user.';
}
} else {
echo 'User not found.';
}
// 根据条件删除多个记录
User::deleteAll(['status' => 'inactive']); // 删除所有状态为inactive的用户
验证规则
<?php
namespace app\models;
use yii\base\Model;
class MyForm extends Model
{
public $name;
public $email;
public $password;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
// name字段是必填项
['name', 'required'],
// name字段的长度应在3到255个字符之间
['name', 'string', 'min' => 3, 'max' => 255],
// email字段是必填项,并且必须是有效的电子邮件地址
['email', 'required'],
['email', 'email'],
// password字段是必填项,并且长度应在6到255个字符之间
['password', 'required'],
['password', 'string', 'min' => 6, 'max' => 255],
// 自定义验证规则
['password', 'validatePassword']
];
}
/**
* 自定义验证器方法
*
* @param string $attribute 属性名
* @param mixed $params 验证参数
*/
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) { // 如果之前没有错误,才执行自定义验证
// 这里添加自定义验证逻辑,例如检查密码复杂度等
if (!preg_match('/[a-z]/', $this->password) || !preg_match('/[A-Z]/', $this->password) || !preg_match('/\d/', $this->password)) {
$this->addError($attribute, '密码必须包含至少一个小写字母、一个大写字母和一个数字。');
}
}
}
}
调用模型验证
$model = new MyForm();
// 假设$data是从表单提交中获取的数组
if ($model->load($data) && $model->validate()) {
// 数据验证通过,可以执行保存或其他操作
} else {
// 数据验证失败,可以获取错误信息并显示给用户
$errors = $model->getFirstErrors();
// 处理$errors...
}
常用验证规则
public function rules()
{
return [
[['username', 'email'], 'required'],
['email', 'email'],
['username', 'string', 'max' => 255],
['age', 'number'],
['post_count', 'integer'],
['password', 'compare', 'compareAttribute' => 'password_repeat'],
['username', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This username has already been taken.'],
['status', 'in', 'range' => [0, 1, 2]],
['description', 'filter', 'filter' => 'trim'],
['custom_field', 'validateCustomField'],
];
}
public function validateCustomField($attribute, $params)
{
if (!preg_match('/[a-zA-Z]+/', $this->$attribute)) {
$this->addError($attribute, 'The custom field must contain at least one letter.');
}
}
模型关系
- 一对多
<?php
namespace app\models;
use yii\db\ActiveRecord;
class User extends ActiveRecord
{
// ... 其他属性和方法 ...
/**
* @return \yii\db\ActiveQuery
*/
public function getPosts()
{
return $this->hasMany(Post::class, ['user_id' => 'id']);
}
}
- 一对一
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Post extends ActiveRecord
{
// ... 其他属性和方法 ...
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::class, ['id' => 'user_id']);
}
}
- 调用
$user = User::findOne(1); // 假设用户ID为1
$posts = $user->posts; // 通过getPosts()方法访问关系
$post = Post::findOne(10); // 假设帖子ID为10
$user = $post->user; // 通过getUser()方法访问关系
$users = User::find()->with('posts')->all();
foreach ($users as $user) {
// 这里可以直接访问$user->posts,不需要额外的数据库查询
foreach ($user->posts as $post) {
}
}
标签:yii2,验证,模型,echo,user,password,email,User
From: https://www.cnblogs.com/hu308830232/p/18105291