3 关注者

为多个模型获取数据

在处理一些复杂数据时,您可能需要使用多个不同的模型来收集用户输入。例如,假设用户登录信息存储在 user 表中,而用户个人资料信息存储在 profile 表中,您可能希望通过 User 模型和 Profile 模型来收集有关用户的输入数据。借助 Yii 模型和表单支持,您可以以与处理单个模型没有太大区别的方式解决此问题。

在下文中,我们将展示如何创建一个表单,使您能够收集 UserProfile 模型的数据。

首先,收集用户和个人资料数据的控制器操作可以编写如下:

namespace app\controllers;

use Yii;
use yii\base\Model;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use app\models\User;
use app\models\Profile;

class UserController extends Controller
{
    public function actionUpdate($id)
    {
        $user = User::findOne($id);
        if (!$user) {
            throw new NotFoundHttpException("The user was not found.");
        }
        
        $profile = Profile::findOne($user->profile_id);
        
        if (!$profile) {
            throw new NotFoundHttpException("The user has no profile.");
        }
        
        $user->scenario = 'update';
        $profile->scenario = 'update';
        
        if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) {
            $isValid = $user->validate();
            $isValid = $profile->validate() && $isValid;
            if ($isValid) {
                $user->save(false);
                $profile->save(false);
                return $this->redirect(['user/view', 'id' => $id]);
            }
        }
        
        return $this->render('update', [
            'user' => $user,
            'profile' => $profile,
        ]);
    }
}

update 操作中,我们首先从数据库加载要更新的 $user$profile 模型。然后,我们调用 yii\base\Model::load() 来使用用户输入填充这两个模型。如果加载成功,我们将验证这两个模型,然后保存它们——请注意,我们使用 save(false) 跳过模型内部的验证,因为用户输入数据已过验证。如果加载不成功,我们将渲染 update 视图,该视图具有以下内容:

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

$form = ActiveForm::begin([
    'id' => 'user-update-form',
    'options' => ['class' => 'form-horizontal'],
]) ?>
    <?= $form->field($user, 'username') ?>

    ...other input fields...
    
    <?= $form->field($profile, 'website') ?>

    <?= Html::submitButton('Update', ['class' => 'btn btn-primary']) ?>
<?php ActiveForm::end() ?>

如您所见,在 update 视图中,您将使用两个模型 $user$profile 渲染输入字段。

发现错字或您认为此页面需要改进?
在 github 上编辑它 !