Search code examples
laravelmigrationlaravel-migrationslaravel-exceptions

how to add exception in laravel migration?


I'm doing a migration and I want the execution of "artisan migrate" to stop until a field does not have the value 'CONTACT_INFO' inside.
What I want to do is an exception when I detect that this value is not there.

 public function up()
    {
        $emailConfiguration = EConfig::where('clave','CONTACTO_NAME')->get()->first();
        $eConfig = EConfig::find($emailConfiguration->pages_id);
        $Languages = Language::all();

        foreach ($Languages as $key => $lang) {
            $exists = !is_null($eConfig->pages_id);
            if ($exists) {
                $value = $eConfig->detail()->where('language_id', $lang->languages_id)->first()->pages_valor;
                if (strpos($value,'CONTACTO_INFO') == false) {
                    InvalidOrderException::reportable(function (InvalidOrderException $e) {
                        echo 'error';
                    });
                }
            }
        }
        
        
    }

Solution

  • If I'm understanding your question correctly, you want to stop the migrations if a certain condition is not satisfied.

    To do so, you need to throw the exception you want, for instance, with your code :

    public function up()
    {
            //... 
    
            foreach ($Languages as $key => $lang) {
                $exists = !is_null($eConfig->pages_id);
                
                if ($exists) {
                    // ...
                    if (strpos($value,'CONTACTO_INFO') == false) {
                        throw new \RuntimeException('Migration stopped due to invalid data');
                    }
                }
            }    
    }
    

    However you may want to wrap it in a transaction to avoid any undesired behaviors

    use Illuminate\Support\Facades\DB;
    
    public function up()
    {
      DB::transaction(function(){
              //... 
    
              foreach ($Languages as $key => $lang) {
                  $exists = !is_null($eConfig->pages_id);
                
                  if ($exists) {
                      // ...
                      if (strpos($value,'CONTACTO_INFO') == false) {
                          throw new \RuntimeException('Migration stopped due to invalid data');
                      }
                  }
              }    
      }
    });
    

    If you want to customize your exception, you can create your own with php artisan make:exception MyMigrationCustomException