Yii2 wbraganca-dynamicform更新使用yii2-relation-trait不删除项目
问题描述:
基于https://github.com/wbraganca/yii2-dynamicform/wiki/Dynamic-Forms-With-Yii2-relation-trait-(VERY-EASY),我试图实现动态forms.Create工作完美,但在Update窗体中,如果我删除任何动态窗体元素,它是没有被删除,但如果我在更新操作中添加,它将被保存。 这是我更新的代码Yii2 wbraganca-dynamicform更新使用yii2-relation-trait不删除项目
public function actionUpdate($id)
{
$modelAlumni = $this->findModel($id);
$modelsJob = $modelAlumni->jobs;
if ($modelAlumni->loadAll(Yii::$app->request->post()) && $modelAlumni->saveAll()) {
return $this->redirect(['view', 'id' => $modelAlumni->id]);
} else {
return $this->render('update', [
'modelAlumni' => $modelAlumni,
'modelsJob' => (empty($modelsJob)) ? [new Job] : $modelsJob
]);
}
}
为什么不删除?
这是我的校友模型
<?php
namespace app\models;
use Yii;
/**
* This is the model class for table "alumni".
*
* @property integer $id
* @property string $name
* @property integer $gender
* @property integer $contact_number
* @property string $year_graduated
* @property string $qualification
* @property integer $department_id
* @property integer $specialization
* @property string $email
*
* @property Job[] $jobs
*/
class Alumni extends \yii\db\ActiveRecord
{
use \mootensai\relation\RelationTrait;
public $organization;
public $designation;
public $location;
public $current_status;
public $joining_date;
/**
* @inheritdoc
*/
public static function tableName()
{
return 'alumni';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'gender', 'contact_number', 'year_graduated', 'qualification', 'department_id', 'specialization', 'email'], 'required'],
[['name', 'organization', 'designation', 'location'], 'string'],
[['gender', 'contact_number', 'department_id', 'specialization'], 'integer'],
[['year_graduated'], 'safe'],
[['qualification', 'email'], 'string', 'max' => 500],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'name' => Yii::t('app', 'Name'),
'gender' => Yii::t('app', 'Gender'),
'contact_number' => Yii::t('app', 'Contact Number'),
'year_graduated' => Yii::t('app', 'Year Graduated'),
'qualification' => Yii::t('app', 'Qualification'),
'department_id' => Yii::t('app', 'Department ID'),
'specialization' => Yii::t('app', 'Specialization'),
'email' => Yii::t('app', 'Email'),
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getJobs()
{
return $this->hasMany(Job::className(), ['alumni_id' => 'id']);
}
}
这是我的工作模式
<?php
namespace app\models;
use Yii;
/**
* This is the model class for table "job".
*
* @property integer $job_id
* @property string $organization
* @property string $current_status
* @property string $designation
* @property string $joining_date
* @property string $location
* @property integer $alumni_id
*
* @property Alumni $alumni
*/
class Job extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'job';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['organization', 'current_status', 'designation', 'joining_date', 'location', 'alumni_id'], 'required'],
[['organization'], 'string'],
[['joining_date'], 'safe'],
[['alumni_id'], 'integer'],
[['current_status', 'designation'], 'string', 'max' => 300],
[['location'], 'string', 'max' => 255],
[['alumni_id'], 'exist', 'skipOnError' => true, 'targetClass' => Alumni::className(), 'targetAttribute' => ['alumni_id' => 'id']],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'job_id' => Yii::t('app', 'Job ID'),
'organization' => Yii::t('app', 'Organization'),
'current_status' => Yii::t('app', 'Current Status'),
'designation' => Yii::t('app', 'Designation'),
'joining_date' => Yii::t('app', 'Joining Date'),
'location' => Yii::t('app', 'Location'),
'alumni_id' => Yii::t('app', 'Alumni ID'),
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getAlumni()
{
return $this->hasOne(Alumni::className(), ['id' => 'alumni_id']);
}
}
答
有例子,看看actionUpdate
https://github.com/wbraganca/yii2-dynamicform
先找到所有嵌套模型IDS不在电流POST请求
$oldIDs = ArrayHelper::map($modelsAddress, 'id', 'id');
$modelsAddress = Model::createMultiple(Address::classname(), $modelsAddress);
Model::loadMultiple($modelsAddress, Yii::$app->request->post());
$deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsAddress, 'id', 'id')));
然后保存mainModel后交易中删除:
if (! empty($deletedIDs))
{
Address::deleteAll(['id' => $deletedIDs]);
}
这是例子,你必须实施自己的解决方案。
我认为这是错误的关系,triat: https://github.com/mootensai/yii2-relation-trait/issues/27
所以上面是最好的解决办法
+0
我试过你的建议。但动态元素不会保留有关验证错误的数据 – user7282
你需要做的这个你自己。如果loadAll和saveAll完成,则删除需要删除的模型。查看https://wbraganca.com/yii2extensions/dynamicform-demo1/source-code into actionUpdate()(搜索* deletedIDs *)。你会看到你必须为自己的解决方案实施的删除操作。考虑使用事务。 – robsch
https://github.com/wbraganca/yii2-dynamicform/wiki/Dynamic-Forms-With-Yii2-relation-trait-(VERY-EASY)使用另一种方法。它使用https://github.com/mootensai/yii2-relation-trait,他们认为它更简单 – user7282
你是对的。但我没有使用这些库,所以我不能帮你。你可以调试RelationTrait.php。 – robsch