How to validate integrity when trying to save duplicate data to the database?

Asked

Viewed 339 times

3

Context:

When trying to register the object Structure checklist the following error occurred: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '6-5' for key 'un_checklist_estrutura' (SQL: insert intochecklist_structure(modelo_id,itens_id) values (6, 5))

Doubt: How do I fix this problem? How do I validate the system to fix this error?

1. Structure Checklist data registration screen inserir a descrição da imagem aqui

2. Error when trying to register the Structure Checklist data inserir a descrição da imagem aqui

3. Model ER inserir a descrição da imagem aqui

4. Consultation in the Database inserir a descrição da imagem aqui

5. Model of Checklistitem (method modelsNaoVinculated() )

   <?php

namespace App\Models;

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

class ChecklistItem extends Model
{
    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. Model 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 the Checklistetruturacontroller.php class

//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. Debugging when registering the checklist object

inserir a descrição da imagem aqui

10. Error: inserir a descrição da imagem aqui

2 answers

2

This message means that you are doing another insertion with the same combination of columns that are part of the table un_checklist_estrutura, which must be defined as UNIQUE. If so, it does not allow inserting the same combination (it seems to consist of two fields) twice.

If you are entering records, verify that you are identifying a new registration ID or that the combination of the registration ID and the other column is unique.

1

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

1º Perform validation in the Request made by the form:

You can create a request for it to validate the data before it even reaches the controller, create a request php artisan make:request CheckListRequest then inside the file in the function autorize() change to true, after that within the function rules you enter the parameters that will be performed the validation, 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 catchblock explained, controller explanation:

The try catch is trial and error method, 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');
 }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.