我想清楚地解释我的问题,
使用wbraganca/yii2-dynamicform
这里create actio
n工作正常,但在update
动作
在我标记的代码中,我不知道我需要做什么,我在(addresses)
表中没有这样的字段customer
。我坚持了。
假设我在模型中创建一个变量,如public $addressess
,它会让我再次重新加载表,这会导致更新同一个表单,数据重新加载并将表单查看为空而不为空,
如果在该名称上创建一个函数,我不知道该写什么... 我只是使用这样的代码
public function getaddressess()
{
}
创建操作代码
public function actionCreate()
{
$modelCustomer = new Customer;
$modelsAddress = [new Address];
if ($modelCustomer->load(Yii::$app->request->post())) {
$modelsAddress = Model::createMultiple(Address::classname());
Model::loadMultiple($modelsAddress, Yii::$app->request->post());
// ajax validation
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelsAddress),
ActiveForm::validate($modelCustomer)
);
}
// validate all models
$valid = $modelCustomer->validate();
$valid = Model::validateMultiple($modelsAddress) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $modelCustomer->save(false)) {
foreach ($modelsAddress as $modelAddress) {
$modelAddress->customer_id = $modelCustomer->id;
if (! ($flag = $modelAddress->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $modelCustomer->id]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this->render('create', [
'modelCustomer' => $modelCustomer,
'modelsAddress' => (empty($modelsAddress)) ? [new Address] : $modelsAddress
]);
}
帮我解决这个问题
答案 0 :(得分:2)
$modelsAddress=$modelCustomer->addresses
表示相关Address()
个实例的数组
public function actionCreate()
{
$modelCustomer = new Customer;
$modelsAddress = $this->getaddressess($modelCustomer->id);
//...................
}
public function getaddressess($id)
{
$model = Address::find()->where(['id' => $id])->all();
return $model;
}
答案 1 :(得分:0)
它应该是getAddresses()
而不是getaddresses()
(虽然两者都可行,但我会选择第一个符合惯例)。或者,如果您不需要额外的封装,则可以设置public $addresses
。
suppose if i create a variable in model like public $addressess, it makes me the reload the table again, and that cause while update the same form, data's getting reload and form viewing as empty without empty,
我认为你有一个验证问题 - 没有验证器将该字段标记为安全,并且在发布后您将其视为空。
public $addresses
添加到您的客户模型。答案 2 :(得分:0)
此行代码---> $ modelsAddress = $ modelCustomer->地址;
来自型号 客户的第 - 一行<&gt; 公共函数getAddresses()
此公共函数行代码是yii2上来自活动记录方法的get array 相关表的代码。
答案 3 :(得分:0)
$ modelCustomer-&gt;地址字地址应来自$ modelCustomer模型,您必须与添加多个值的另一个表有关系。在我在视频中描述的例子中我有两个表po表和po_items表po_items表有po_id的外键。因此,当您使用gii创建模型时,您将在模型中获得您必须使用的关系而不是地址。
根据我的数据库的关系应该是 - 你可以在第14行看到这个
答案 4 :(得分:0)
来自
public function getaddressess($id)
{
$model = Address::find()->where(['id' => $id])->all();
return $model;
}
在上方共享,您还需要添加
更新视图文件上:
'model' => $model,
'modelsAddress'=>$modelsAddress,
希望这会有所帮助。它对我有用
答案 5 :(得分:-1)
enter image description here在 Po.php 模型中:
public function getPoItems()
{
return $this->hasMany(PoItem::className(), ['po_id' => 'id']);
}
在 PoController.php 中
public function actionUpdate($id)
{
$model = $this->findModel($id);
//$modelsPoItem = [new PoItem];
$modelsPoItem = $model->poItems;
if ($model->load(Yii::$app->request->post()) && $model->save())
{
$oldIDs = ArrayHelper::map($modelsPoItem, 'id', 'id');
$modelsPoItem = Model::createMultiple(PoItem::classname(), $modelsPoItem);
Model::loadMultiple($modelsPoItem, Yii::$app->request->post());
$deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsPoItem, 'id', 'id')));
// validate all models
$valid = $model->validate();
$valid = Model::validateMultiple($modelsPoItem) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save(false)) {
if (! empty($deletedIDs))
{
PoItem::deleteAll(['id' => $deletedIDs]);
}
foreach ($modelsPoItem as $modelPoItem)
{
$modelPoItem->po_id = $model->id;
if (! ($flag = $modelPoItem->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->id]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this->render('update', [
'model' => $model,
'modelsPoItem' => (empty($modelsPoItem)) ? [new PoItem] : $modelsPoItem
]);
}