【问题标题】:Yii multi model with HAS_MANY Tabular form具有 HAS_MANY 表格形式的 Yii 多模型
【发布时间】:2013-05-24 08:28:46
【问题描述】:

我一直在尝试为我认为相当简单的事情找到解决方案?我想做的是创建一个表格来收集一些调查记录。

Table: survey_record
id
meter_id
status_id
create_time
create_user

Table: survey_inspection
id
survey_record_id (FK)
bay_id
bay_usage_id

因此,表survey_inspection HAS_MANY 检查来自survey_record。 假设检查员正在对meter_id = 1001 进行调查,那么用户识别仪表的status_id,他们必须填写4 个检查条目,因为1001 有4 个托架。 为了生成 4 个托架,我简单地创建了一个 for 循环。效果很好。

查看:_form.php

...
$meter=Meter::model()->findByPk($model->meter_id);
$bays = count($meter->bays); //retrieves the number of inspections required

<?php echo $form->dropDownListRow($model,'status_id',$model->getStatusId(),array('prompt'=>'Select Status ...')); ?>

...
<?php for ($i = 1; $i <= $bays; $i++): ?>

<?php echo $form->textFieldRow($inspection, "[$i]bay_id", array('readonly'=>true, 'value'=>"$i", 'class'=>'span1')); ?>

<?php echo $form->dropDownListRow($inspection, "[$i]bay_usage_id", $inspection->getUsageId(), array('prompt'=>'Bay Status ...') ); ?>   

<?php endfor; ?>
...

但是,当我提交表单时,我只收到两个(不是四个)结果,而且我似乎无法正确显示经过验证的字段。所以这里是著名的控制器文件:SurveyRecordController.php

public function actionCreate($survey_id, $meter_id)
{

    $model=new SurveyRecord;
    $inspection = new SurveyInspection;

    $model->survey_id = (int)$survey_id;
    $model->meter_id  = (int)$meter_id;


    if(isset($_POST['SurveyRecord'], $_POST['SurveyInspection']))
    {
        $model->attributes=$_POST['SurveyRecord'];
        $valid= $model->validate();

            $i=1;
            foreach($_POST['SurveyInspection'][$i] as $inspection)
            {
                $inspection = new SurveyInspection;

                $inspection->bay_id     =$_POST['SurveyInspection'][$i]['bay_id'];
                $inspection->bay_usage_id   =$_POST['SurveyInspection'][$i]['bay_usage_id']; 


                $valid= $inspection->validate() && $valid; 

                echo '<br/><br/><br/><pre>';
                print_r($_POST['SurveyInspection'][$i]);
                echo '</pre>';

                if($valid)
                {
                    if($model->save(false))
                    {
                        $inspection->survey_record_id = $model->id;
                        $inspection->save(false); 
                        $this->redirect(array('/meter')); 
                    }
                }
                $i++;

                //$inspection->attributes=$_POST['SurveyInspection'][$i];

            }


    }

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

我有一种有趣的感觉,我可能没有正确执行 foreach 循环,因为当我查看数组 $_POST['SurveyInspection'][$i] 时,我只返回了两个条目应该有四个。

一些可能有用的信息:

PHP版本:5.4.14 Yii 版本:1.1.13 PostgreSQL 版本:9.1.9

谢谢你:)

【问题讨论】:

    标签: php yii foreach multi-model-forms


    【解决方案1】:

    据我所知,我认为您通过传递绕过了默认验证 false 保存方法(例如:$model->save(false))并且你也在使用 yii 的验证函数。我想你尝试删除 false 参数,只使用 save() 来解决验证问题

    【讨论】:

    • @nihad 你是对的,我删除了 false 但仍然没有得到预期的结果。
    • 然后试试 PeterM 建议的代码 你的 foreach 循环不正确
    【解决方案2】:

    foreach 循环是错误的。您可以使其正确且更清洁:

    foreach($_POST['SurveyInspection'] as $i => $value)
    {
        $inspection = new SurveyInspection;
        $inspection->bay_id     = $value['bay_id'];
        $inspection->bay_usage_id   = $value['bay_usage_id']; 
        ...
    

    $i++ 不需要,因为foreach 将循环每个元素。

    【讨论】:

    • 谢谢彼得,我已经清理了我的 foreach,但不幸的是,这并没有解决我的问题。
    【解决方案3】:

    我采取了完全不同的方法,欢迎提出宝贵建议 :) 希望这对你们中的一些人有所帮助。

    控制器:

    public function actionCreate($survey_id, $meter_id)
    {
    
        $bays = $this->getBayCount($meter_id);
    
        for ($i=1;$i<=$bays;$i++)
        {   
            $model=new SurveyRecord;
            $model->survey_id = (int)$survey_id;
            $model->meter_id  = (int)$meter_id;
            ${'inspection_'.$i} = new SurveyInspection($i);
    
            if(isset($_POST['SurveyRecord'], $_POST["SurveyInspection"][$i]))
            {
                $model->attributes = $_POST['SurveyRecord'];
                ${'inspection_'.$i}->attributes = $_POST["SurveyInspection"][$i];
    
    
                echo '<br/><br/><br/><pre>';
                print_r(${'inspection_'.$i}->attributes);
                echo '</pre>';
    
            }
    
        }
    
        for ($i=1;$i<=$bays;$i++)
        {
            ${'inspection_'.$i} = new SurveyInspection($i);
            $inspection['inspection_'.$i] = ${'inspection_'.$i};
        }
    
        $this->render('create',array(
        'inspection'=>$inspection,
        'model'=>$model
        )); 
    
    }
    

    查看:

    ...
    <div class="control">
    <?php echo $form->dropDownListRow($model,'status_id',$model->getStatusId(),array('prompt'=>'Select Status ...')); ?>
    
    <?php
        $meter=Meter::model()->findByPk($model->meter_id);
        $bays = count($meter->bays);
    ?>
    <?php for ($i=1; $i<=$bays; $i++): ?>
    <table>
    <tr>
        <td><?php echo $form->textFieldRow($inspection["inspection_$i"], "[$i]bay_id", 
            array('readonly'=>true, 'value'=>"$i", 'class'=>'span1')); ?></td>
        <td><?php echo $form->dropDownListRow($inspection["inspection_$i"], "[$i]bay_usage_id", $inspection["inspection_$i"]->getUsageId(),
            array('prompt'=>'Bay Status ...') ); ?></td>    
    </tr>
    </table>
    <?php endfor; ?>    
    
    </div>
    ...
    

    信用:http://yiiblog.info/blog/index.php/post/108/Rename+ACtiveRecord+$_POST+array's+Name+to+update+multimodels

    注意:在视图/控制器上仍有一些工作要做(似乎无法在 $_POST 上选择我在第二个模型上的下拉菜单),一旦我修复它就会发布。

    感谢@PeterM 和@Ninad 的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多