I've a postgres database table that uses uuid's as its primary key, via the webpatser/laravel-uuid package, and 'readable' web ids via vinkla/hashids.
When I query the database, if I dd() the response, I see the UUID in full, but if I simply return, I instead get an integer.
Presume I've overlooking something obvious, so:
Migration
$table->uuid('id');
$table->string('web_id');
$table->primary('id');
Model
public function store()
{
$data = [
'id' => Uuid::generate(4)->string,
'web_id' => Hashids::encode(mt_rand(1,1000000)),
I'm assuming something happens when the data is cast to json, but I'm not sure where'd I'd begin to tackle this...
I also see the same behaviour in artisan tinker, fwiw:
>>> $result = App\Model::firstOrFail()
=> App\Model {#675
id: "587bb487-881d-417e-8960-fbecaa3b270b",
web_id: "Mxqv4LYP",
created_at: "2016-01-25 15:52:25+00",
updated_at: "2016-01-25 15:52:25+00",
}
>>> $result->id
=> 587
Eloquent makes the assumption that the primary key (which is named id
by default) is an integer, and it casts it to int
by default in the getCasts
method:
public function getCasts()
{
if ($this->incrementing) {
return array_merge([
$this->getKeyName() => 'int',
], $this->casts);
}
return $this->casts;
}
This can be overwritten by specifying that the primary key is not auto incrementing by adding this to your model:
$incrementing = false;
Or by casting the id
column to string
in the $casts
property of the model, like so:
protected $casts = [
'id' => 'string'
]
As described in the Eloquent: Attribute Casting documentation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With