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

Guía rápida para uso de widget kartik para select para formulario

Cómo incluir una vista dentro de un modal

Tutorial de implementación de calendario de rango de fechas con Karkit en gridView

Google Plus desaparecerá el 4 de Abril de 2019

Crear fomulario HTML con checkbox sin Active Record

hostinger

ventana bienvenida