Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Eloquent (in Laravel) cast my varchar uuid primary key to an integer resulting in errors?

Following up on my last night's question, I had a good night of sleep and "discovered" that this happens due to automatic casting / type conversion or whatever.

To summerize:

  • Models use uuidas primary key
  • They get them by a trigger on insert from mySQL
  • To get the uuid generated by the database runtime I call $model_object->fresh(); fresh()
  • This works when getting the object as a whole, but not when selecting just an attribute

Model

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Address extends Model {

    protected $table = 'Addresses';
    protected $fillable = ['uuid', 'zipCode', 'houseNumber'];
    protected $primaryKey = 'uuid';
    //public $incrementing = false;
}

Controller (where it screws up)

public function store(Request $request) {
    $input = $request->all();
    $address = Address::create($input);
    var_dump($address); exit;

//result (as expected)

    $address = $address->fresh();
    var_dump($address); exit;

//result (as expected)

var_dump($address->uuid); exit;//result (wow): int(0)
}
like image 819
online Thomas Avatar asked Nov 29 '16 19:11

online Thomas


People also ask

Is laravel UUID unique?

UUIDs are created by your application, so you don't have to wait for the database server to create new users. Since you create your UUIDs independent of the database, you can split your data between multiple database servers. UUIDs are secure, as they're randomly generated and unique, so they can't be guessed.

What is type casting in laravel?

Casting a value means changing it to (or ensuring it is already) a particular type. Some types you might be familiar with are Integer or Boolean . Simply put, type casting is a method of changing an entity from one data type to another.


1 Answers

For those coming here later. You can override the $keyType variable in your model with the string type:

protected $keyType = 'string';
like image 125
Deric Lima Avatar answered Sep 17 '22 08:09

Deric Lima