为什么Laravel / Eloquent的fresh函数返回一个对象,但是调用它的属性返回0? [英] Why does Laravel / Eloquent's fresh function return an object, but calling it's attribute return 0?
问题描述
我的代码在Eloquent中有一个地址 Model
,它看起来像这样:
My code has an Address Model
in Eloquent, it looks like this:
值得注意:我的所有模型都使用uuid作为主键,它是由MySQL DB中的触发器生成的。
Noteworthy: all my models use an uuid for primary key, it is generated by a trigger in the MySQL DB. This on its own works well.
<?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; //<- without this it returns 0, with it returns null
}
In在我的控制器上,我创建了一个函数来创建一个新地址,该地址从触发器中获取其uuid(如上所述)。为了将此uuid(也是外键)传递给我的用户,我尝试调用 fresh();
In my controller I create a function to create a new Address that gets its uuid from a trigger (as mentioned above). To pass this uuid, that is also a foreign key, to my user I try to call fresh();
<?php
public function store(Request $request) {
$input = $request->all();
try {
$address = Address::create($input);
// Call fresh to also get the trigger generated uuid primaryKey
$address = $address->fresh(); //bug!!!
//$address = Address::query()->where('zipCode', '=', $address->zipCode)->where('houseNumber', '=', $address->houseNumber)->first(); //works, but is not as nice
} catch (\exception $e) {
$response['error'] = $e->getMessage();
return response($response, 400);
}
}
在重新加载(并获取我的uuid)之前, $ address
对象等于
before reloading (and getting my uuid), the $address
object equals
object(App\Models\Address)#186 (23) {
["table":protected]=>
string(9) "Addresses"
["fillable":protected]=>
array(3) {
[0]=>
string(4) "uuid"
[1]=>
string(7) "zipCode"
[2]=>
string(11) "houseNumber"
}
["primaryKey":protected]=>
string(4) "uuid"
["incrementing"]=>
bool(false)
["connection":protected]=>
NULL
["keyType":protected]=>
string(3) "int"
["perPage":protected]=>
int(15)
["timestamps"]=>
bool(true)
["attributes":protected]=>
array(4) {
["zipCode"]=>
string(6) "4651ZX"
["houseNumber"]=>
string(2) "34"
["updated_at"]=>
string(19) "2016-11-28 23:13:47"
["created_at"]=>
string(19) "2016-11-28 23:13:47"
}
["original":protected]=>
array(4) {
["zipCode"]=>
string(6) "4651ZX"
["houseNumber"]=>
string(2) "34"
["updated_at"]=>
string(19) "2016-11-28 23:13:47"
["created_at"]=>
string(19) "2016-11-28 23:13:47"
}
["relations":protected]=>
array(0) {
}
["hidden":protected]=>
array(0) {
}
["visible":protected]=>
array(0) {
}
["appends":protected]=>
array(0) {
}
["guarded":protected]=>
array(1) {
[0]=>
string(1) "*"
}
["dates":protected]=>
array(0) {
}
["dateFormat":protected]=>
NULL
["casts":protected]=>
array(0) {
}
["touches":protected]=>
array(0) {
}
["observables":protected]=>
array(0) {
}
["with":protected]=>
array(0) {
}
["exists"]=>
bool(true)
["wasRecentlyCreated"]=>
bool(true)
}
如果在我的地址模型中 $ incrementing = false;
被定义,我调用 $ address = $ address-> fresh();
现在 $ address
对象等于 NULL
If in my Address Model $incrementing = false;
is defined, and I call $address = $address->fresh();
now the $address
object equal NULL
如果我在我的地址模型中省略 $ incrementing = false;
,然后调用 $ address = $ address-> fresh();
现在 $ address
对象等于
If i omit in my Address Model $incrementing = false;
, and I call $address = $address->fresh();
now the $address
object equal
object(App\Models\Address)#195 (23) {
["table":protected]=>
string(9) "Addresses"
["fillable":protected]=>
array(3) {
[0]=>
string(4) "uuid"
[1]=>
string(7) "zipCode"
[2]=>
string(11) "houseNumber"
}
["primaryKey":protected]=>
string(4) "uuid"
["connection":protected]=>
NULL
["keyType":protected]=>
string(3) "int"
["perPage":protected]=>
int(15)
["incrementing"]=>
bool(true)
["timestamps"]=>
bool(true)
["attributes":protected]=>
array(5) {
["uuid"]=>
string(36) "0e85ea0c-b5c0-11e6-9c20-002590f967ca"
["zipCode"]=>
string(6) "4651ZX"
["houseNumber"]=>
string(2) "34"
["updated_at"]=>
string(19) "2016-11-28 23:11:56"
["created_at"]=>
string(19) "2016-11-28 23:11:56"
}
["original":protected]=>
array(5) {
["uuid"]=>
string(36) "0e85ea0c-b5c0-11e6-9c20-002590f967ca"
["zipCode"]=>
string(6) "4651ZX"
["houseNumber"]=>
string(2) "34"
["updated_at"]=>
string(19) "2016-11-28 23:11:56"
["created_at"]=>
string(19) "2016-11-28 23:11:56"
}
["relations":protected]=>
array(0) {
}
["hidden":protected]=>
array(0) {
}
["visible":protected]=>
array(0) {
}
["appends":protected]=>
array(0) {
}
["guarded":protected]=>
array(1) {
[0]=>
string(1) "*"
}
["dates":protected]=>
array(0) {
}
["dateFormat":protected]=>
NULL
["casts":protected]=>
array(0) {
}
["touches":protected]=>
array(0) {
}
["observables":protected]=>
array(0) {
}
["with":protected]=>
array(0) {
}
["exists"]=>
bool(true)
["wasRecentlyCreated"]=>
bool(false)
}
我想要的是!
但是,只要我调用 $ address ['uuid']
或 $ address-> ; uuid
返回 int(0)
(不为NULL)
But as soon as I call $address['uuid']
or $address->uuid
it returns int(0)
(not NULL)
推荐答案
我必须用uuid作为字符串填充 casts
数组。
I had to fill the casts
array with uuid being a string.
这篇关于为什么Laravel / Eloquent的fresh函数返回一个对象,但是调用它的属性返回0?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!