【问题标题】:How to modify two databes tables in one form in YiiYii如何以一种形式修改两个数据库表
【发布时间】:2014-04-13 01:26:03
【问题描述】:

我已经创建了一个表单来从我的网站页面编辑我的数据库中的一个表(hotel_rooms),它可以正常工作。 但是我需要在 privious 表 (hotel_rooms) 的编辑网页中包含另一个表 (hotel_rooms_checked) 中的一些字段,而不是所有表 请问我该怎么做?其中hotel_rooms.Id = hotel_rooms_checked.Id 这是表单的代码

    <?php
    /* @var $this HotelRoomsController */
    /* @var $model HotelRooms */
    /* @var $form CActiveForm */
    ?>

    <div class="form">

    <?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'hotel-rooms-form',
        'enableAjaxValidation'=>false,
    )); ?>

        <p class="note">Fields with <span class="required">*</span> are required.</p>

        <?php echo $form->errorSummary($model); ?>

        <div class="row">
            <?php echo $form->labelEx($model,'Id'); ?>
            <?php echo $form->textField($model,'Id',array('size'=>60,'maxlength'=>255)); ?>
            <?php echo $form->error($model,'Id'); ?>
        </div>

.......
    <?php $this->endWidget(); ?>

    </div><!-- form -->

这是控制器代码

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

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

        if(isset($_POST['HotelRooms']))
        {
            $model->attributes=$_POST['HotelRooms'];
            if($model->save())
        // $this->redirect(Yii::app()->request->urlReferrer);

                $this->redirect(array('hotels/index','id'=>$model->Id));
        }

        $this->render('update',array(
            'model'=>$model,
        ));
    }

查看代码是

<?php
/* @var $this HotelRoomsController */
/* @var $model HotelRooms */

$this->breadcrumbs=array(
    'Hotel Rooms'=>array('index'),
    $model->Id,
);

$this->menu=array(
    array('label'=>'List HotelRooms', 'url'=>array('index')),
    array('label'=>'Create HotelRooms', 'url'=>array('create')),
    array('label'=>'Update HotelRooms', 'url'=>array('update', 'id'=>$model->Id)),
    array('label'=>'Delete HotelRooms', 'url'=>'#', 'linkOptions'=>array('submit'=>array('delete','id'=>$model->Id),'confirm'=>'Are you sure you want to delete this item?')),
    array('label'=>'Manage HotelRooms', 'url'=>array('admin')),
);
?>

<h1>View Room : <?php echo $model->Id; ?></h1>

<?php $this->widget('zii.widgets.CDetailView', array(
    'data'=>$model,
    'data'=>$model2,
    'attributes'=>array(
        'Id',
        'HotelName',
        'HotelRoomsType',
        ....
    ),
)); ?>

桌子的结构

Hotel_Rooms
Id
HotelName
HotelRoomsType
.....

Hotel_Rooms_Checked
Id
DateCheckedIn
DateCheckedOut
....

【问题讨论】:

    标签: php database forms yii


    【解决方案1】:

    嗯,这个问题似乎还不够清楚。不过,我会尝试猜测您想要什么。

    对于view,只需添加其他model 的字段(我想您已经为hotel_rooms_checked 创建了一个模型)

    <?php
        /* @var $this PropUnitController */
        /* @var $model HotelRooms */
        /* @var $model2 HotelRoomsChecked */
        /* @var $form CActiveForm */
        ?>
    
        <div class="form">
    
        <?php $form=$this->beginWidget('CActiveForm', array(
            'id'=>'hotel-rooms-form',
            'enableAjaxValidation'=>false,
        )); ?>
    
            <p class="note">Fields with <span class="required">*</span> are required.</p>
    
            <?php echo $form->errorSummary(array($model, $model2)); ?>
    
            <div class="row">
                <?php echo $form->labelEx($model,'Id'); ?>
                <?php echo $form->textField($model,'Id',array('size'=>60,'maxlength'=>255)); ?>
                <?php echo $form->error($model,'Id'); ?>
            </div>
    
            <!--for example, let's say we have an attribute `status` for HotelRoomsChecked-->
            <div class="row">
                <?php echo $form->labelEx($model2,'status'); ?>
                <?php echo $form->textField($model2,'status',array('size'=>60,'maxlength'=>255)); ?>
                <?php echo $form->error($model2,'status'); ?>
            </div>
    
    .......
        <?php $this->endWidget(); ?>
    
        </div><!-- form -->
    

    现在对于控制器,您可以在实际保存之前对两个模型进行验证。

    public function actionUpdate($id)
        {
            $model=$this->loadModel($id);
            $model2 = HotelRoomsChecked::model()->findByPk($id);
    
            // Uncomment the following line if AJAX validation is needed
            // $this->performAjaxValidation($model);
    
            if(isset($_POST['HotelRooms']) && isset($_POST['HotelRoomsChecked']))
            {
                $model->attributes=$_POST['HotelRooms'];
                $model2->attributes = $_POST['HotelRoomsChecked'];
                $valid = $model->validate();
                $valid = $valid && $model2->validate();
    
                if($valid) {
            // $this->redirect(Yii::app()->request->urlReferrer);
                    $model->save();
                    $model2->save();
                    $this->redirect(array('hotels/index','id'=>$model->Id));
                }
            }
    
            $this->render('update',array(
                'model'=>$model,
                'model2' => $model2,
            ));
        }
    

    【讨论】:

    • 重播我试过但我有这个错误:未定义的变量:model2
    • 即使添加 'model2' => $model2, 总是同样的错误,
    • 好吧,_form 是视图文件。无论如何,请您尝试在“$model2 = HotelRoomsChecked::model()->findByPk($id);”之后添加几行代码在控制器中: if ($model2 == null) echo "missing";否则回显“好”;查看 $model2 是否正确实例化?
    • 哦,我刚刚发现您在视图文件中使用了“CDetailView”。 “CDetailView”用于显示一个单一模型的详细信息。这可能就是你得到错误的原因。尝试为 $model2 使用另一个 CDetailView。
    • 最后我发现错误来自哪里我忘了在更新和创建文件中添加model2 echo $this->renderPartial('_form', array('model'=>$模型,'model2' => $model2)); ?>
    【解决方案2】:

    只需从控制器传递两个模型:

    public function actionUpdate($id)
    {
        $model=$this->loadModel($id);
    
        // assuming second model has same ID. Modify $id accordingly
        $model2=HotelRoomsChecked::model()->findByPk($id);
    
        if(isset($_POST['HotelRooms']) && isset($_POST['HotelRoomsChecked'])) //!
        {
            $model->attributes=$_POST['HotelRooms'];
            $model2->attributes=$_POST['HotelRoomsChecked']; //!
    
            if($model->save() && $model2->save()) //!
                $this->redirect(array('hotels/index','id'=>$model->Id));
        }
    
        $this->render('update',array(
            'model'=>$model,
            'model2'=>$model2, //!
        ));
    }
    

    并且只需按照您在问题中发布的方式使用表单中的第二个模型。

    【讨论】:

    • 感谢重播我试过但我有这个错误:未定义变量:model2
    • 错误出现在 _form 代码中,我已经在 _form 代码的第一行添加了 /* @var $model2 HotelRoomsChecked */
    • 这就是我得到的
       object(HotelRoomsChecked)[89] private '_md' (CActiveRecord) => object(CActiveRecordMetaData)[67] public 'tableSchema' => object(CMysqlTableSchema)[68 ] public 'schemaName' => null public 'name' => string 'hotek_rooms_checked' (length=12) public 'rawName' => string 'hotek_rooms_checked' (length=14) public 'primaryKey' => string 'Id' (length=2) public 'sequenceName' => null public 'foreignKeys' => array (size=0) ...
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2017-07-14
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多