首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii2:如何在Yii2上删除带有关系3的表

Yii2:如何在Yii2上删除带有关系3的表
EN

Stack Overflow用户
提问于 2018-07-23 02:53:44
回答 2查看 297关注 0票数 1

我有以下表格,我想点击删除在Pak按钮,可以删除所有3个表的关系。

我怎样才能做到这一点呢?

代码语言:javascript
复制
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]);
}
EN

回答 2

Stack Overflow用户

发布于 2018-07-23 10:38:57

将约束与innoDB引擎一起使用

如果您使用的是InnoDB,并且正确地添加了约束on delete cascade并在模型中定义了相应的关系,那么您就不必担心其他表中的相关记录,只需在Pak中找到该模型并将其删除即可。

代码语言:javascript
复制
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模型中定义了以下关系

代码语言:javascript
复制
public function getChurch(){
    return $this->hasOne(Church::className(), ['id_pak'=>'id_pak']);
}

以及Church模型中的以下内容

代码语言:javascript
复制
public function getMember(){
    return $this->hasOne(Member::className(),['id_church'=>'id_church']);
}

然后覆盖Pak模型中的beforeDelete()

代码语言:javascript
复制
public function beforeDelete() {
    $this->church->delete();
    return parent::beforeDelete ();
}

并覆盖Church模型中的beforeDelete()

代码语言:javascript
复制
public function beforeDelete() {
    $this->member->delete();
    return parent::beforeDelete ();
}

在你的actionDelete()中只需找到模型并调用delete

代码语言:javascript
复制
public function actionDelete($id)
{
    $this->findModel($id)->delete();

    return $this->redirect(['index']);
}

还有一篇关于在父模型here中实现recursiveDelete()方法的很好的文章。

票数 0
EN

Stack Overflow用户

发布于 2018-07-23 17:55:44

下面的代码可能会帮助你解决问题。

代码语言:javascript
复制
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]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51468307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档