How to do integrity validation when trying to save duplicate data to the database?

3

Context:

When attempting to register the Structure Checklist object, the following error occurred: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '6-5' for key 'un_checklist_estrutura' (SQL: insert into checklist_astructure ( model_id , items_id ) values (6, 5))

Doubt: How to solve this problem? How do I validate for the system to handle this error?

1. Structure Checklist data record screen

2.ErrortryingtoregistertheStructureChecklistdata

3.ModelER

4.QueryintheDatabase

5.ModelChecklistItem(methodNodeVinculated()methods)

<?phpnamespaceApp\Models;useIlluminate\Database\Eloquent\Model;useDB;useSoftDeletes;classChecklistItemextendsModel{protected$table="checklist_itens";

    protected $primaryKey = 'id';

    public $incrementing = false;

    public $timestamps = false;

    public function checklistItem()
    {
      return $this->belongsTo('App\Models\ChecklistItem', 'id');

    }
       //Relacionamentos entre a tabela checklist_modelo e checklist_itens  (relacionamento m:m "muitos para muitos")
       /* public function checklistEstrutura()
       {
          return  $this->belongsToMany(ChecklistEstrutura::class, 'checklist_modelo', 'modelo_id',  'itens_id');
       }
        */

     public function checkListModelos()
     {
        return $this->belongsToMany(ChecklistModelo::class, 'checklist_estrutura');
     }


       public function modelosNaoVinculados()
       {
           $checkListsModelo = CheckListModelo::whereNotIn('id', function($query){
                                     $query->select('checklist_estrutura.modelo_id');
                                     $query->from('checklist_estrutura');
                                     $query->whereRaw("checklist_estrutura.itens_id = {$this->id} ");
                                 })->sql();

           return $checkListsModelo;
       }


    //Este método salva os dados do Checklist do Item
      public function salvar(ChecklistItem $checklistItem) : Array
      {
           $checklistItem = $this->save();

           if($checklistItem){

              return[
                  'success' => true,
                  'message' => 'Sucesso ao cadastrar'
              ];   
          }
          else{

              return[
                  'success' => false,
                  'message' => 'Falha ao cadastrar'
              ]; 
          }
      }


      //Este método remove os dados do Checklist do Item
    public function deletar(ChecklistItem $checklistItem) : Array
    {
        $checklistItem = $this->delete();
        if($checklistItem){

            return[
                'success' => true,
                'message' => 'Sucesso ao excluir'
            ];   
        }
        else{

            return[
                'success' => false,
                'message' => 'Falha ao excluir'
            ]; 
        }
    }


  //Este método atualiza os dados do  Checklist do Item
  public function alterar(ChecklistItem $checklistItem) : Array
  {
    $checklistItem = $this->save();
      if($checklistItem){
          return[
              'success' => true,
              'message' => 'Sucesso ao atualizar'
          ];   
      }
      else{
          return[
              'success' => false,
              'message' => 'Falha ao atualizar'
          ]; 
      }
  }
}

6. Template ChecklistModel

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use DB;
use SoftDeletes;

class ChecklistModelo extends Model
{
    protected $table = "checklist_modelo";

    protected $primaryKey = 'id';

    public $incrementing = false;

    public $timestamps = false;

    public function checklistModelo()
    {
        return $this->belongsTo('App\Models\ChecklistModelo', 'id');
    }


    public function checkListItens()
    {
      return $this->belongsToMany(ChecklistItem::class, 'checklist_estrutura');
    }


      //Relacionamentos entre a tabela checklist_modelo e checklist_itens  (relacionamento m:m "muitos para muitos")
      /* public function checklistEstrutura()
      {
         return  $this->belongsToMany(ChecklistEstrutura::class, 'checklist_modelo', 'modelo_id',  'itens_id');
      } */

    //Este método salva os dados do Checklist do Modelo
      public function salvar(ChecklistModelo $checklistModelo) : Array
      {
           $checklistModelo = $this->save();
          if($checklistModelo){

              return[
                  'success' => true,
                  'message' => 'Sucesso ao cadastrar'
              ];   
          }
          else{

              return[
                  'success' => false,
                  'message' => 'Falha ao cadastrar'
              ]; 
          }
      }


      //Este método remove os dados do Checklist do Modelo
    public function deletar(ChecklistModelo $checklistModelo) : Array
    {
        $checklistModelo = $this->delete();
        if($checklistModelo){

            return[
                'success' => true,
                'message' => 'Sucesso ao excluir'
            ];   
        }
        else{

            return[
                'success' => false,
                'message' => 'Falha ao excluir'
            ]; 
        }
    }


  //Este método atualiza os dados do  Checklist do Modelo
  public function alterar(ChecklistModelo $checklistModelo) : Array
  {
    $checklistModelo = $this->save();
      if($checklistModelo){
          return[
              'success' => true,
              'message' => 'Sucesso ao atualizar'
          ];   
      }
      else{
          return[
              'success' => false,
              'message' => 'Falha ao atualizar'
          ]; 
      }
  }
}

8. Registration method of class ChecklistErrorController.php

//Método para cadastrar um checklist de estrutura
   //ERRO: é necessário fazer a validação de integridade, por exemplo se um item e modelo forem salvos 2 vezes ocorre um erro no banco de dados
   public function cadastro(Request $request)
    {
        //Recebe os dados do formulário a saber: modelo_id e itens_id (array de dados)
        $modelo_id = $request->get('modelo_id');
        $itens_id = [];
        $arrayItensId  = [];
        $itens_id = $request->get('itens_id');


         $checklistItem = ChecklistItem::where('id', $itens_id);
        // dd($checklistItem);
       // $checklistItem = ChecklistItem::where('id', 1)->first();
        //$checklistItem->attach([5,6,7,8,9,10,11,12,13]);
        $checklistItem->attach([$modelo_id]);
        dd($checklistItem );

     #controller
   // $checkListItens = CheckListItem::where('id', 1)->first();

     //$checkListItens = CheckListItem::where('id', $itens_id);
     //  dd($checkListItens);
    #modelosNaoVinculados
   // $checkListsModelo = $checkListItens->modelosNaoVinculados();
   // dd($checkListsModelo);

        //Esta estrutura de repetição salva os dados do checklist de estrutura
        /* for ($i=0; $i < sizeof($itens_id); $i++) {
            $checklistEstrutura = new ChecklistEstrutura();
            $checklistEstrutura->modelo_id = $modelo_id;
            $checklistEstrutura->itens_id  = $itens_id[$i];
            $response =  $checklistEstrutura->salvar($checklistEstrutura); 
        } */

            if($response['success']){
                return redirect()
                            ->route('admin.checklistEstrutura') 
                            ->with('success',$response['message']);
            }
            else{
                return redirect()
                            ->back()
                            ->with('error',$response['message']); 
            }   
    }

9. Debug when registering object checklist Structure



10.Error:

    
asked by anonymous 28.08.2018 / 16:59

2 answers

2

This message means that you are making another insert with the same combination of columns that are part of the un_checklist_estrutura table, which should be set to UNIQUE . If so, do not enter the same combination (it seems to consist of two fields) twice.

If you are inserting records, make sure you are identifying a new record ID, or if the combination of record ID and the other column is unique.

    
28.08.2018 / 17:10
1

This error can be handled in several ways, I will indicate two that can assist you in the process:

1st Perform validation in the Request that was done by the form:

You can create a request so that it validates the data even before it arrives at the controller, then create a request php artisan make:request CheckListRequest within the file in function autorize() change to true , after that within the rules you enter the parameters that will be validated, ie:

public function rules()
{
   return [
    'modelo_id' => 'required|unique:checklist_estrutura,modelo_id',
    'modelo_id' => 'required|unique:checklist_estrutura,itens_id',
   ];
}

2º Use the blocks try catch explanation of the block , explanation in the controller:

The try catch is a trial and error method, a practical example in your code

public function cadastro(Request $request)
{
    try {
      //Recebe os dados do formulário a saber: modelo_id e itens_id (array de 
      dados)
      $modelo_id = $request->get('modelo_id');
      $itens_id = [];
      $arrayItensId  = [];
      $itens_id = $request->get('itens_id');



      //Falta validar os dados
      $arrayItensId[] = [DB::table('checklist_estrutura')->select('itens_id')- 
      >where('modelo_id', '=',  $modelo_id)->distinct()->get()];  

      //dd($arrayItensId);

      //$arraysIguais   = array_intersect_assoc($arrayItensId, $itens_id) ;
      //dd($arraysIguais);
      //dd($arrayItensId);
      //dd($itens_id);
      // $arraysIguais = array_intersect($arrayItensId, $itens_id);
      // dd($arraysIguais);


      //Esta estrutura de repetição salva os dados do checklist de estrutura
      for ($i=0; $i < sizeof($itens_id); $i++) {
        $checklistEstrutura = new ChecklistEstrutura();
        $checklistEstrutura->modelo_id = $modelo_id;
        $checklistEstrutura->itens_id  = $itens_id[$i];
        $response =  $checklistEstrutura->salvar($checklistEstrutura); 
      }

        if($response['success']){
            return redirect()
                        ->route('admin.checklistEstrutura') 
                        ->with('success',$response['message']);
        }
        else{
            return redirect()
                        ->back()
                        ->with('error',$response['message']); 
        }   
     }
  } catch ( \Exception $e ) {
   // insere aqui o deve ser feito caso ocorra erro na funcao
   return redirect()->back()->withInputs()->with('error', 'Erro no  cadastro');
 }
    
30.08.2018 / 14:26