Como validar relaciones entre registros antes de eliminar

Por default Yii no valida dentro de sus CRUDs una eliminación física, para éstos casos se debe de validar de manera manual.


Para estos casos podemos aplicar el siguiente método, y solo aplicaría para una eliminación física, en una eliminación lógica podria utilizarse otros métodos que aquí no se mencionan. 

Paso #1

Edita el modelo de donde quieres hacer la validación y agrega las siguientes líneas.

    public function beforeDelete(){
        return (count($this->getRelaciones()) > 0)?false:parent::beforeDelete();
    }
    
    public function getRelaciones(){
        $models = array();
        empty( $this->getPermisoConstruccions()->all() )?"": $models[] = $this->getPermisoConstruccions()->all();
        return $models;
    }


A continuación explico lo que hace cada línea.

El método "beforeDelete()" es un método reservado del modelo que es utilizado para realizar alguna acción justo antes de ejecutar el método Delete.

Dentro de el estamos mandando llamar una función llamada "getRelaciones()", la cual hace lo siguiente: 

 $models = array(); // Inicializar un arreglo donde guardará cada uno de los modelos.


Esta línea busca todas las relaciones que existen con este modelo, esto regresa un arreglo con todos los modelos involucrados
$this->getPermisoConstruccions()->all();

Si no hay relaciones regresará un arreglo vacío o de lo contrario agregara todos los modelos al arreglo.


   empty( $this->getPermisoConstruccions()->all() )?"": $models[] = $this->getPermisoConstruccions()->all(); 


Paso #1 

Puedes validar en el Controller para que no borre a menos que no existan relaciones.

public function actionDelete($id) {
         $result = $this->findModel($id)->delete();
         if($result==false){
             Yii::$app->getSession()->setFlash('warning', 'Existe por lo menos una solicitud ligada a este registo por lo que no podrá eliminarla');
         }else{
             Yii::$app->getSession()->setFlash('success', 'Se ha borrando el registro de manera permanente con éxito');
         }
        return $this->redirect(['index']);
    }

Gracias por dejar tus mensajes.

Fuentes:

https://www.yiiframework.com/doc/api/2.0/yii-db-baseactiverecord#beforeDelete()-detail

Comentarios

Aprende Yii2


Lo más Visto

Como crear formulario HTML de carga de archivo sin Active Record

Como personalizar pagina de error 404

Como enviar un correo si se produce un error en el sistema

Como agregar select2 como filtro de un gridview utilizando Ajax para la búsqueda de elementos

Como crear un log por categoría

hostinger

ventana bienvenida