Spec-Zone.ru › Yii 2.0

Получение данных для нескольких моделей

При работе с некоторыми сложными данными, возможно, потребуется использовать несколько разных моделей для сбора пользовательского ввода. Например, предполагая, что информация о входе пользователя хранится в таблице user, а информация о профиле пользователя хранится в таблице profile, вы можете захотеть собрать данные о пользователе с помощью модели User и модели Profile. С поддержкой модели и формы Yii вы можете решить эту проблему, не сильно отличаясь от обработки одной модели.

В дальнейшем мы покажем, как создать форму, которая позволит собирать данные для моделей User и Profile.

Сначала действие контроллера для сбора данных пользователя и профиля можно записать следующим образом,

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.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-input-multiple-models.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API