Validation Unique não funciona

274 views
Skip to first unread message

Hermiro Carvalho

unread,
Aug 31, 2020, 9:58:43 AM8/31/20
to Laravel Brasil
Bom dia.

Eu estou começando no Laravel e estou precisando fazer uma validação num determinado campo... ele precisa ser único... já olhei em diversos outros posts e no meu não funciona... admito que é por falta de experiência... mas se alguém tiver uma dica... 
Meu arquivo ClienteRequest

public rules() {

...
...
$return['stcd2'] = 'required|unique:CLIENTE,stcd2';//Campo de CPF
}

E na chamada do método no controller eu tenho
ClienteController
 public function salvar(ClienteRequest $request){

}

Guilherme Medeiros

unread,
Aug 31, 2020, 10:02:02 AM8/31/20
to laravel...@googlegroups.com
Vc está adicionando UNIQUE no banco?
Como que está a sua migration?



--
Você recebeu essa mensagem porque está inscrito no grupo "Laravel Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para laravel-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/laravel-brasil/0ce072ad-65ac-4ecd-bf67-dcca36380ef3n%40googlegroups.com.

Ronaldo Oliveira

unread,
Aug 31, 2020, 10:04:13 AM8/31/20
to laravel...@googlegroups.com
Cara,
Tenho um exemplo que implementei:
public function store(Request $request)
{

$data = $request->validate([
'name' =>'required|max:60',
'cpf' => 'required|unique:customers|max:14',
'birth' => 'nullable|date',
'email' => 'email',
'cell_phone' => 'nullable'
]);

$data['contract_id'] = $request->contract_id;
$customer = Customer::create($data);

$customer->contracts()->attach($data['contract_id']);

return redirect('/customers')->with('success','Cliente foi salvo com sucesso!!!');

}
Ats,
Oliveira/Ronaldo




Em seg., 31 de ago. de 2020 às 10:58, Hermiro Carvalho <miro9...@gmail.com> escreveu:

Ronaldo Oliveira

unread,
Aug 31, 2020, 10:06:01 AM8/31/20
to laravel...@googlegroups.com
Na Migrate
public function up()
{
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->string('name',60);
$table->string('cpf',14)->unique();
$table->date('birth')->nullable();
$table->string('email')->unique();
$table->string('cell_phone',12)->nullable();
$table->timestamps();
});
}


Ats,
Oliveira/Ronaldo




Em seg., 31 de ago. de 2020 às 10:58, Hermiro Carvalho <miro9...@gmail.com> escreveu:

Hermiro Carvalho

unread,
Aug 31, 2020, 10:15:31 AM8/31/20
to Laravel Brasil
Pessoal.

Na verdade com eu disse...eu estou começando no Laravel... e esse portal que eu estou mexendo não fui eu que fiz e não existe nenhuma documentação... mas depois das respostas eu fui olhar o migration e ele esta assim...
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CriaTabelaCliente extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cliente', function (Blueprint $table) {
$table->string('STCD2', 11)->nullable();            // CPF
});
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cliente');
    }
}

Pelo que eu vi no banco... esse campo é só um char simples... 
O Model esta assim:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;


class Cliente extends Model
{
  protected $table = 'cliente';
protected $primaryKey = 'id';
protected $fillable = [ 'stcd2',

            ];


   public function ArquivosClientes()
    {
      return $this->hasMany('App\AnexaArquivosClientes');
    }

    /*
    public function parceiros(){
    return $this->HasMany('App\ParceiroCliente');
    }
*/
public function parceiros(){
return $this->HasMany(ParceiroCliente::class, 'cliente_id');
}

    public function FormataMascara($val, $mask){
         $maskared = '';
         $k = 0;
         for($i = 0; $i<=strlen($mask)-1; $i++)
         {
         if($mask[$i] == '#')
         {
         if(isset($val[$k]))
         $maskared .= $val[$k++];
         }
         else
         {
         if(isset($mask[$i]))
         $maskared .= $mask[$i];
         }
         }
         return $maskared;
      }


}

Onde eu indico que esse campo (STCD2) deve ser único?

Ronaldo Oliveira

unread,
Aug 31, 2020, 10:23:19 AM8/31/20
to laravel...@googlegroups.com
Você indica na migrate e  na controller.

Na migrate: $table->string('STCD2', 11)->unique();

Na controller: ''STCD2''=>'required|unique:cliente',

Ats,
Oliveira/Ronaldo




Guilherme Medeiros

unread,
Aug 31, 2020, 10:44:23 AM8/31/20
to laravel...@googlegroups.com
É isso ai.
Quando vc colocar a migration para o campo ser UNIQUE no banco, grande parte dos seus problemas vai acabar.

Hermiro Carvalho

unread,
Aug 31, 2020, 10:54:50 AM8/31/20
to Laravel Brasil
Ronaldo.

Eu inclui conforme voce me disse... o migration ficou assim...
$table->string('STCD2', 11)->unique();            
porém lá no ClienteRequest eu adicionei assim:
$return['stcd2'] = 'required|unique:CLIENTE';

O ClienteController eu teria que fazer algo assim?

$this->validate($request, [
            'stcd2' => 'required|unique:CLIENTE,stcd2'
        ]);

Hermiro Carvalho

unread,
Aug 31, 2020, 11:04:15 AM8/31/20
to Laravel Brasil
Ele continua duplicando... essa página tem um função chamada 'adicionarEditar'...ela é quem 'abre' a página... quando o usuário clica no botão ela vai para outra função no controller de cliente (SALVAR)... essa parte do controller eu preciso colocar na função de SALVAR certo?

Hermiro Carvalho

unread,
Aug 31, 2020, 4:10:59 PM8/31/20
to Laravel Brasil
Pessoal... eu não faço idéia do porque não funciona... então eu adotei uma solução POG (Programação Orientada a Gambiarra... kkkk), fiz isso aqui e funcionou para mim...

         $dados = $request->all();
$id = $dados['id'];

if ($id <= 0 ){
$valida_cpf_anterior = null;
$check_cpf_anterior = null;
$valida_cpf_anterior = $this->formataMascara($dados['stcd2']);
$check_cpf_anterior = Cliente::where('stcd2', '=', $valida_cpf_anterior)->first();
if (!empty($check_cpf_anterior)){
\Session::flash('mensagem', ['msg' =>'Não foi possível continuar: Já existe um CPF cadastrado anteriormente!', 'class'=>'alert alert-error',
                                  ]);        
return back()->withInput();
}

Claro que não vou deixar assim... mas pelo menos para apagar o incêndio acho que já ajuda... a versão que eu estou usando é a 5.4...

Ricardo Bomfim

unread,
Aug 31, 2020, 4:26:40 PM8/31/20
to laravel...@googlegroups.com
Se você utilizar desta maneira faça o seguinte:

php artisan make:rule NomeDaRule
Na rule você pode testar o que precisar, como numa classe normal.

daí use na Request assim:
''STCD2''=>  [ new NomeDaRule ],

Hermiro Carvalho

unread,
Aug 31, 2020, 4:49:20 PM8/31/20
to laravel...@googlegroups.com
Ricardo.

Eu tentei isso... Mas não aparece a opção de make::rule nas opções do partisan... Acho que é a versão...

Ricardo Bomfim

unread,
Aug 31, 2020, 6:26:02 PM8/31/20
to laravel...@googlegroups.com
Sim, desculpe não reparei.
Acho que é mais novo mesmo.

Podes tentar assim: 'required|unique:tabela,campo'.$id,

Reply all
Reply to author
Forward
0 new messages