2015-05-12 10:55:01 11605次浏览 8条回答 15 悬赏 100 金钱

先说我想问什么,现在有一个表格,比如商家登记要卖的商品:
商品名称 商品种类 数量
手机 电子产品 2
电脑 电子产品 1
书籍 书籍 10
这个表单如上已经填写好,现在提交后如何同时写入三条记录到数据库?
并且不一定仅仅是三条,要实现用户点击“添加”按钮就会多一行表单。
我的代码问题在哪里?
控制器:

public function actionRelease() 
    {
        $model = new Seller();
        $goods=[new Goods()];
        $count = count(Yii::$app->request->post('Goods', []));
        for($i = 1; $i < $count; $i++) {
            $goods[] = new Goods();
        }
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $model->save(); 
            if (Model::loadMultiple($goods, Yii::$app->request->post()) && Model::validateMultiple($goods)) {
                foreach ($goods as $good) {
                    $good->release_date=  date('y-m-d',time());
                    $good->seller_id=$model->id;
                    $good->save(false);
                }
            return $this->render('release-confirm');
            }
            return $this->render('release-wrong');
        } else {
            // 无论是初始化显示还是数据验证错误
            return $this->render('release', ['model' => $model,'goods'=>$goods]);
        }
    }

视图:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
//use kartik\select2\Select2;
?>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name'); ?>
<?= $form->field($model, 'gender')->dropDownList(['男'=>'男','女'=>'女']) ?>
<?= $form->field($model, 'student_number') ?>
<?= $form->field($model, 'mobile') ?>
<?= $form->field($model, 'if_big')->dropDownList(['有'=>'有','没有'=>'没有']) ?>
<?= $form->field($model, 'if_alipay')->dropDownList(['是'=>'是','否'=>'否']) ?>
<?= $form->field($model, 'if_present')->dropDownList(['是'=>'是','否'=>'否']) ?>
<?= $form->field($model, 'sell_time')->dropDownList(['全天'=>'全天','上午'=>'上午','下午'=>'下午']) ?>

<?php
foreach ($goods as $index => $v) {
    echo $form->field($v, "name[]")->label($v->name);
    echo $form->field($v, "cate[]")->dropDownList(['书籍'=>'书籍','生活用品'=>'生活用品','电子产品'=>'电子产品','其他'=>'其他'])->label($v->name);
    echo $form->field($v, "number[]")->label($v->name);
}
?>


<div class="form-group">
    <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>

模型数据如下:

<?php

namespace app\models;

use yii\db\ActiveRecord;
/**
 * LoginForm is the model behind the login form.
 */
class Goods extends ActiveRecord
{
    public static function getDb()
    {
        return \Yii::$app->db2;  
    }
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['name', 'cate','number'], 'required'],
            // rememberMe must be a boolean value
            ['name', 'string','length'=>[1,10]],
            ['number', 'number'],
        ];
    }
    public function getSeller()
    {
        return $this->hasOne(Seller::className(), ['id' => 'seller_id']);
        //'id'是表seller里面的,'seller_id'是本表里面的
    }
    public function attributeLabels() {
        parent::attributeLabels();
        return [
            'name'=>'名称',
            'cate'=>'种类',
            'number'=>'数量',
            'sell_time'=>'登记时间',
            
        ];
    }
}

和:

<?php
namespace app\models;
use yii\db\ActiveRecord;

class Seller extends ActiveRecord
{
    public static function getDb()
    {
        return \Yii::$app->db2;
    }
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            [['name', 'gender','student_number','mobile','if_alipay','if_present','if_big','sell_time'], 'required'],
            ['name', 'string','length'=>[1,5]],
            ['student_number', 'number','min'=>0,'max'=>9999999999],
            ['mobile', 'number','min'=>0,'max'=>99999999999],
        ];
    }
    
    public function attributeLabels() {
        parent::attributeLabels();
        return 
        ['name'=>'姓名',
        'gender'=>'性别',
        'qq'=>'qq(选填)',
        'wechat'=>"微信(选填)",
            'student_number'=>'学生号',
            'major'=>'专业(选填)',
            'grade'=>'年级(选填)',
            'mobile'=>'手机号码',
            'if_big'=>'是否有大件商品',
            'if_present'=>'6.3号当天是否能亲自到场摆摊',
            'if_agent'=>'是否同意将书籍放入书籍专区,由工作人员售出',
            'if_together'=>'是否同意与他人合摊',
            'if_alipay'=>'是否同意用支付宝付款',
            'if_donate'=>'是否同意将未售出物品捐赠',
            'sell_time'=>'摆摊时间',
        ];
    }
    public function getGoods()
    {
        //建立一对多关系
        return $this->hasMany(Goods::className(), ['seller_id' => 'id']);
    }
    
}

官方文档我在看,这部分在开发中。求大牛解,我们比比速度。

最佳答案

  • 发布于 2015-05-12 11:22 举报
    foreach ($goods as $index => $v) {
        echo $form->field($v, "name[]")->label($v->name);
        echo $form->field($v, "cate[]")->dropDownList(['书籍'=>'书籍','生活用品'=>'生活用品','电子产品'=>'电子产品','其他'=>'其他'])->label($v->name);
        echo $form->field($v, "number[]")->label($v->name);
    }
    

    foreach ($goods as $index => $v) {
        echo $form->field($v, "[{$index}]name")->label($v->name);
        echo $form->field($v, "[{$index}]cate")->dropDownList(['书籍'=>'书籍','生活用品'=>'生活用品','电子产品'=>'电子产品','其他'=>'其他'])->label($v->name);
        echo $form->field($v, "[{$index}]number")->label($v->name);
    }
    
    1 条回复
    回复于 2015-05-12 11:59 回复

    好好!谢谢你的回答,我在controller中还漏了一个use yii\base\Model;

    觉得很赞
  • 回答于 2015-05-12 11:13 举报

    这里有个Yii1的教程,你先参考一下:
    http://www.yiichina.com/tutorial/9

    2 条回复
    回复于 2015-05-12 11:14 回复

    猴,我先看看,谢谢舰长关心

    回复于 2015-11-26 14:58 回复

    舰长 不知道2.0上面是否能将这个例子完善下,官网或者其他几个都是写的开发中

  • 回答于 2015-05-12 11:16 举报

    视图:

    <?php
    foreach ($goods as $index => $v) {
        echo $form->field($v, "{$index}name")->label($v->name);
        echo $form->field($v, "{$index}cate")->dropDownList(['书籍'=>'书籍','生活用品'=>'生活用品','电子产品'=>'电子产品','其他'=>'其他'])->label($v->name);
        echo $form->field($v, "{$index}number")->label($v->name);
    }
    ?>
    
    2 条回复
    回复于 2015-05-12 11:19 回复

    Well,maybe that's how "It is important to add a proper index to input name since that is how Model::loadMultiple() determines which model to fill with which values" should be understood. Thx!!!

    回复于 2015-05-12 12:27 回复

    恩恩,我在controller中漏了一个use yii\base\Model; 视图中"{$index}name"应该再改成"[{$index}]name";总之谢谢你的注意和回答!(默默关注

  • 回答于 2016-12-24 21:35 举报

    感谢分享代码,在你的代码的基础上,我可以实现新增的时候一次插入多条数据。在网上找了js代码实现了点击‘新增一行’和‘删除’一行的功能。但是在更新数据的时候遇到了麻烦,如何在更新的时候,对新增加的行数据进行保存,而对删除了的行数据进行删除呢?
    不知道你有没有已经解决了我遇到的问题?

    觉得很赞
  • 回答于 2017-04-15 13:42 举报

    但是rule验证是个问题,比如动态新增的文本框的值,如果为空值时,在多模型下validateMultiple()会返回全部错误,不知道题主怎么解的,目前研究出来的也只是通过开启表单ajax验证来解决这个rule的问题。

    <form>
       <div class="model-item" data-id="0" data-model="User">
          <input name="User[0][login]" data-attribute="login" />
          <input name="User[0][name]" data-attribute="name" />
       </div>
       <div class="model-item" data-id="1" data-model="User">
          <input name="User[1][login]" data-attribute="login" />
          <input name="User[1][name]" data-attribute="name" />
       </div>
    </form>
    
    [['name'], 'required', 'whenClient' => "function (value, attribute) {
        return $(attribute).closest('.model-item').find('[data-attribute=login]').val().length > 0;
    }"]
    

    参考:
    https://github.com/yiisoft/yii2/issues/9811
    https://github.com/yiisoft/yii2/issues/1399

  • 回答于 2017-11-19 12:39 举报

    不错,学习了

  • 回答于 2019-05-27 11:49 举报

    field($v, "[{$index}]name")

    field($v, "{$index}name"),请问这两种写法谁是正确的?新手表示看不懂,这里的{}、[]应该怎么理解?

  • 回答于 2020-06-21 22:15 举报

    用来标识下表的,用field($v, '['.$index.']name')才可以。

您需要登录后才可以回答。登录 | 立即注册
ArthurSS
总监

ArthurSS 广东珠海

注册时间:2015-03-14
最后登录:2017-05-17
在线时长:61小时10分
  • 粉丝13
  • 金钱1432
  • 威望50
  • 积分2542

热门问题