Yii2 ActiveRecord模型最佳实践

时间:2015-11-16 06:23:16

标签: php activerecord yii2

我有这些课程:

型号:     

namespace app\models;

use \yii\db\ActiveRecord;

class MyModel extends ActiveRecord {

public function rules() {
    return [
        [['name'], 'required'],
        [['id'], 'default', 'value' => null]
    ];
}

}

控制器:

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\MyModel;

class MymodelController extends Controller{

    public function actionEdit($id = null){
        $model = new MyModel();

        if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->save()) {
            Yii::$app->session->setFlash('msg', 'Model has been saved with ID ' . $model->id);
        }

        return $this->render('edit', [
           'model' => $model 
        ]);
    }

}

查看:

<?php 
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>

<?php if(Yii::$app->session->hasFlash('msg')): ?>
    <div class="alert alert-success"><?= Yii::$app->session->getFlash('msg'); ?></div>
<?php endif; ?>

<?php $form = ActiveForm::begin(); ?>

<?= Html::activeHiddenInput($model, 'id');  ?>

<?= $form->field($model, 'name') ?>

<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>

<?php ActiveForm::end(); ?>

我想使用此视图进行编辑和插入。编辑不能正常工作,因为我正在创建一个新对象,而不是在Controller中更改现有对象。我不确定这里的最佳做法是什么,或者我是否遗漏了一些现有的内置功能?

  • 我应该创建自己的模型类并实现逻辑模型&lt; - &gt;控制器中的活动记录

  • 我应该只使用控制器中的$model->id查询数据库,并在需要时复制所有属性吗?

3 个答案:

答案 0 :(得分:3)

你应该使用两个动作进行编辑和插入

编辑首先找到模型

$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('edit', [
            'model' => $model,
        ]);
    }

 protected function findModel($id)
    {
        if (($model = MyModel::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }

如果您使用CRUD生成控制器,则不必编写这些操作。

答案 1 :(得分:2)

对于CRUD(创建,读取/查看,更新和删除),您可以使用gii。此电动工具自动生成ActiveRecord,Controller所需的所有操作,包括基本操作(索引,视图,创建,更新,删除,查找)和相关视图。

在gii中,您首先生成模型类,然后为此类生成CRUD。

但是最有线的事情所有这些信息都是相互关联的

看到这个文档是非常有用的,Yii2的最佳实践是在该工具中实现的 http://www.yiiframework.com/doc-2.0/guide-start-gii.html

答案 2 :(得分:0)

在您的“创建”操作中:

public function actionCreate()
{
    $model = new Yourmodel();

    if ($model->load(Yii::$app->request->post())) {

        if($model->save()){
            return $this->redirect(['view']);
        }
    }
    return $this->render('create', [
        'model' => $model,
    ]);
}

在您的更新操作中:

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post())) {

        if($model->save()){
            return $this->redirect(['view', 'id' => $model->id]);
        }
    } 
    return $this->render('update', [
        'model' => $model,
    ]);
}