Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel - Integrity constraint violation: 1062 Duplicate entry

i have a problem when i try to create a new user in my database, if I add the users in phpmyadmin i have no problems, but when i try create users in my laravel web, the users has created with this error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '15.236.964-5' for key 'PRIMARY' I dont have idea which is the problem because in the database does not exist the same primary key. The table with problems is:

CREATE TABLE IF NOT EXISTS `users` (
`rut` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `password` char(60) COLLATE utf8_unicode_ci NOT NULL,
  `edad` int(11) NOT NULL,
  `pais` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `comuna` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `sector` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `tipo` enum('profesor','alumno','administrador_parrilla','administrador_sistema','externo') COLLATE utf8_unicode_ci NOT NULL,
  `remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `users`
  ADD PRIMARY KEY (`rut`),
  ADD UNIQUE KEY `usuario_rut_unique` (`rut`),
  ADD UNIQUE KEY `usuario_email_unique` (`email`);

My controller:

class UsuarioController extends Controller
{
	public function index(){
        $users = User::All();
        return view('usuario.index', compact('users'));
    }

    public function create(){
    	return view('usuario.create');
    }
    public function store(Request $request) {
         User::create([
             'name' => $request['name'],
             'rut' => $request['rut'],
             'email' => $request['email'],
             'password' => bcrypt($request['password']),             
             'edad' => $request['edad'],
             'pais' => $request['pais'],
             'comuna' => $request['comuna'],
         ]);
        User::create($request->all());
        return redirect('/usuario')->with('message', 'store');
    }

    public function edit($rut){
        $user = User::find($rut);
        return view ('usuario.edit',['user'=>$user]);
    }

    public function update($id, Request $request){
        $user = User::find($id);
        $user -> fill($request->all());
        $user -> save();

        Session::flash('message', 'Usuario Editado Correctamente');
        return Redirect ('/usuario');
    }
}

My Model:

class User extends Authenticatable
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $table = "users";
    protected $fillable = [
        'rut', 'name', 'email', 'password', 'edad', 'pais', 'comuna', 'sector', 'tipo',
    ];
/**
    protected $primaryKey = 'rut';

    
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

I can't change the primary key adding auto_increment because i use the "Rut" as a primary key who is the code of identification to people in Chile.

like image 399
Bullgod Avatar asked Jun 21 '16 20:06

Bullgod


1 Answers

Do following steps:

1) Remove ADD UNIQUE KEY usuario_rut_unique (rut).

Because You already defined that rut is primary key, so PKs are always unique (it's PKs behaviour)

2) Define in Your model that rut is primary key, and disable auto incrementing because it's varchar (not int cannot be iterated naturally) :

/**
 * primaryKey 
 * 
 * @var integer
 * @access protected
 */
protected $primaryKey = 'rut'; 
/*
You cannot comment it to make in disabled, it will look for `id` param by default.
You cannot set it to be = null because in Your code You use ::find() function 
that looks for primaryKey.
 */

/**
 * Indicates if the IDs are auto-incrementing.
 *
 * @var bool
 */
public $incrementing = false;

3) Remove this line:

User::create($request->all());

because You're already inserting record to database in previous line.

like image 183
num8er Avatar answered Oct 05 '22 10:10

num8er