我有一个postgres数据库表,它使用uuid作为主键,通过 webpatser / laravel-uuid 包,并且可读' web ID通过 vinkla / hashids 。
当我查询数据库时,如果我 dd()响应,我会完整地看到UUID,但如果我只是返回,我会得到一个整数。
假设我忽略了一些显而易见的事情,所以:
移植
$table->uuid('id');
$table->string('web_id');
$table->primary('id');
模型
public function store()
{
$data = [
'id' => Uuid::generate(4)->string,
'web_id' => Hashids::encode(mt_rand(1,1000000)),
我假设在将数据投射到json时发生了某些事情,但我不知道我在哪里开始解决这个问题......
我也在工匠修补匠看到同样的行为,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
答案 0 :(得分:9)
Eloquent假设主键(named id
by default)是一个整数,并且在getCasts
方法默认情况下将其强制转换为int
:
public function getCasts()
{
if ($this->incrementing) {
return array_merge([
$this->getKeyName() => 'int',
], $this->casts);
}
return $this->casts;
}
可以通过将主键添加到模型中来指定主键不自动递增来覆盖它:
$incrementing = false;
或者将id
列转换为模型的string
属性中的$casts
,如下所示:
protected $casts = [
'id' => 'string'
]
如Eloquent: Attribute Casting文档中所述。