我的Yii2应用程序中有两个模型:
Racks(rackID,rowID,...)
RackObjects(rack_objectID,rackID,objectID,...)
在我的机架控制器中,我有:
public function actionUpdate($id)
{
$model = $this->findModel($id);
$modelsRackObjects = $model->rackObjects;
if ($model->load(Yii::$app->request->post())) {
$oldIDs = ArrayHelper::map($modelsRackObjects, 'rack_objectID', 'rack_objectID');
$modelsRackObjects = Racks::createMultiple(RackObjects::classname(), $modelsRackObjects);
Racks::loadMultiple($modelsRackObjects, Yii::$app->request->post());
$deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsRackObjects, 'rack_objectID', 'rack_objectID')));
// validate all models
$valid = $model->validate();
$valid = Racks::validateMultiple($modelsRackObjects) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save(false)) {
if (!empty($deletedIDs)) {
Racks::deleteAll(['rackID' => $deletedIDs]);
}
foreach ($modelsRackObjects as $modelRackObjects) {
$modelRackObjects->rackID = $model->rackID;
if (! ($flag = $modelRackObjects->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->rackID]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this->render('update', [
'model' => $model,
'modelsRackObjects' => (empty($modelsRackObjects)) ? [new RackObjects] : $modelsRackObjects
]);
}
在我的" Racks Model"我有:
public static function createMultiple($modelClass, $multipleModels = [])
{
$model = new $modelClass;
$formName = $model->formName();
$post = Yii::$app->request->post($formName);
$models = [];
if (! empty($multipleModels)) {
$keys = array_keys(ArrayHelper::map($multipleModels, 'rack_objectID', 'rack_objectID'));
$multipleModels = array_combine($keys, $multipleModels);
}
if ($post && is_array($post)) {
foreach ($post as $i => $item) {
if (isset($item['rack_objectID']) && !empty($item['rack_objectID']) && isset($multipleModels[$item['rack_objectID']])) {
$models[] = $multipleModels[$item['rack_objectID']];
} else {
$models[] = new $modelClass;
}
}
}
unset($model, $formName, $post);
return $models;
}
当我更新机架表格并更改一些rackObjects时,我收到此错误:
完整性约束违规 - yii \ db \ IntegrityException SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:外键约束失败
我的动作更新有什么问题???
由于this answer我改变了我的代码,现在当我更新记录时,子表(rackObjects)重复,旧记录没有删除!!任何想法?
答案 0 :(得分:0)
deleteAll()
不会引发beforeDelete
事件。你应该循环:
$racks = Rack::findAll(['rackID' => $deletedIDs]);
foreach($racks as $rack) {
$rack->delete();
}
在Rack
模型中,假设您与hasMany
有RackObjects
的关系
public function beforeDelete() {
if (parent::beforeDelete()) {
foreach($this->rackObjects as $rackObj) {
$rackObj->delete();
}
return true;
} else {
return false;
}
}