为什么Laravel / Eloquent的fresh函数返回一个对象,但是调用它的属性返回0? [英] Why does Laravel / Eloquent's fresh function return an object, but calling it's attribute return 0?

查看:104
本文介绍了为什么Laravel / Eloquent的fresh函数返回一个对象,但是调用它的属性返回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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆