我有以下表格,我想点击删除在Pak按钮,可以删除所有3个表的关系。
我怎样才能做到这一点呢?
table Pak : id_pak, pak_name/////
table Church : id_church, church_name, id_pak/////
table Member : id_member, name_member, id_church////
public function actionDelete($id)
{
$this->findModel($id);
$select = Church::find()
->select('church_name')
->where(['id_pak' => $id])
->all();
$a3 = Church::find()
->select('id_church')
->where(['id_pak' => $id])
->all();
$select2 = Member::find()
->select('member_name')
->where(['id_church'=> $a3])
->all();
Church::find()->where(['id_pak' => $id])->one()->delete();
Pak::find()->where(['id_pak' =>$id])->one()->delete();
Member::find()->where(['id_church'=> $a3])->one()->delete();
return $this->redirect(['index','select'=>$select,'select2'=>$select2]);
}发布于 2018-07-23 10:38:57
将约束与innoDB引擎一起使用
如果您使用的是InnoDB,并且正确地添加了约束on delete cascade并在模型中定义了相应的关系,那么您就不必担心其他表中的相关记录,只需在Pak中找到该模型并将其删除即可。
public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
protected function findModel( $id ) {
if ( ($model = Pak::findOne ( $id )) !== null ) {
return $model;
}
throw new NotFoundHttpException ( 'The requested page does not exist.' );
}手动删除
或者,如果您不使用innoDB或出于任何原因不使用约束,则可以覆盖Pak的ActiveRecord模型中的beforeDelete(),并在Church中移除Pak模型的所有子行,然后覆盖Church中的beforeDelete()以删除Member模型中的所有子行,并从中返回true以继续删除Pak模型中的实际记录
我假设您在Pak模型中定义了以下关系
public function getChurch(){
return $this->hasOne(Church::className(), ['id_pak'=>'id_pak']);
}以及Church模型中的以下内容
public function getMember(){
return $this->hasOne(Member::className(),['id_church'=>'id_church']);
}然后覆盖Pak模型中的beforeDelete()
public function beforeDelete() {
$this->church->delete();
return parent::beforeDelete ();
}并覆盖Church模型中的beforeDelete()
public function beforeDelete() {
$this->member->delete();
return parent::beforeDelete ();
}在你的actionDelete()中只需找到模型并调用delete
public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}还有一篇关于在父模型here中实现recursiveDelete()方法的很好的文章。
发布于 2018-07-23 17:55:44
下面的代码可能会帮助你解决问题。
public function actionDelete($id)
{
$select = Church::find()
->select('church_name')
->where(['id_pak' => $id])
->all();
$a3 = Church::find()
->select('id_church')
->where(['id_pak' => $id])
->all();
$select2 = Member::find()
->select('member_name')
->where(['id_church'=> $a3])
->all();
// ---------- start ---------------
$park = Park::find()->where(['id_pak' => $id])->one();
if ( $park->delete() ){
Pak::deleteAll('id_pak = :id', [':id' => $id]);
foreach ($a3 as $value) {
Member::deleteAll('id_church = :id', [':id' => $value->id_church ]);
}
}
// ---------- end ---------------
return $this->redirect(['index','select'=>$select,'select2'=>$select2]);
}https://stackoverflow.com/questions/51468307
复制相似问题