先说我想问什么,现在有一个表格,比如商家登记要卖的商品:
商品名称 商品种类 数量
手机 电子产品 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']);
}
}
官方文档我在看,这部分在开发中。求大牛解,我们比比速度。
改
这里有个Yii1的教程,你先参考一下:
http://www.yiichina.com/tutorial/9
视图:
感谢分享代码,在你的代码的基础上,我可以实现新增的时候一次插入多条数据。在网上找了js代码实现了点击‘新增一行’和‘删除’一行的功能。但是在更新数据的时候遇到了麻烦,如何在更新的时候,对新增加的行数据进行保存,而对删除了的行数据进行删除呢?
不知道你有没有已经解决了我遇到的问题?
但是rule验证是个问题,比如动态新增的文本框的值,如果为空值时,在多模型下validateMultiple()会返回全部错误,不知道题主怎么解的,目前研究出来的也只是通过开启表单ajax验证来解决这个rule的问题。
参考:
https://github.com/yiisoft/yii2/issues/9811
https://github.com/yiisoft/yii2/issues/1399
不错,学习了
field($v, “[{$index}]name”)
和
field($v, “{$index}name”),请问这两种写法谁是正确的?新手表示看不懂,这里的{}、[]应该怎么理解?
用来标识下表的,用field($v, ‘[‘.$index.’]name’)才可以。