【问题标题】:Yii2: How to delete with relation 3 table on Yii2Yii2:如何删除 Yii2 上的关系 3 表
【发布时间】:2018-12-30 06:52:54
【问题描述】:

我有以下表格,我想在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]);
}

【问题讨论】:

  • 您是否使用定义了约束的innoDB 引擎?

标签: yii2 yii2-advanced-app


【解决方案1】:

以下代码可以帮助您解决问题。

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]);
}

【讨论】:

    【解决方案2】:

    在 innoDB 引擎中使用约束

    如果你使用 InnoDB 并且已经正确添加了约束 on delete cascade 并且在模型中定义了各自的关系,你不需要担心其他表中的相关记录你只需要在 @ 中找到模型987654323@并删除。

    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() 并删除 ChurchPak 模型的所有子行并在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() 中找到模型并调用删除

    public function actionDelete($id)
    {
        $this->findModel($id)->delete();
    
        return $this->redirect(['index']);
    }
    

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

    【讨论】:

    • 我无法删除 3 个表。获取错误尝试在 $memberModel->delete() 处获取非对象的属性“成员”;我在教堂模型中添加功能获取成员并在 Pak 模型中添加功能获取教堂。但找不到成员。我怎样才能实现它?请帮帮我
    • 您确定要在 Pak 中删除的值在 Church 中具有外键,并且 Church 中的值在 Member 模型中具有有效的外键吗?
    • 我建议删除Member内的Church::beforeDelete() - 每个AR都应该负责删除自己的孩子。
    • 嗯,这样更好,我同意@rob006
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多