yii2 模型

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 = 'example@example.com';  
    $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 = 'newemail@example.com';  
  
    // 保存更新到数据库  
    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) {  
        
    }  
}
posted @ 2024-03-30 11:43  胡勇健  阅读(72)  评论(0)    收藏  举报