解决laravel id非自增 模型取回为0 的问题

吾爱主题 阅读:130 2021-08-30 17:03:00 评论:0

问题

laravel5.2 中 如果一个模型的id 为string等非自增类型时候 使用模型的find方法 会返会0

样例代码:

?
1 2 $a =Model::find( 'blcu' ); echo $a ->id; //结果为0

原因查找

通过var_dump(a)发现a)发现a

?
1 2 3 4 [ "attributes" : protected ]=>   array (16) {   [ "id" ]=>   string(4) "blcu"

也就是数据其实是读取出来了 只是->id取得时候 变成了0

查看Model的 getAttribute 方法,此方法指向了 getAttributeValue

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public function getAttributeValue( $key ) {   $value = $this ->getAttributeFromArray( $key );       if ( $this ->hasGetMutator( $key )) {    return $this ->mutateAttribute( $key , $value );   }       if ( $this ->hasCast( $key )) {    return $this ->castAttribute( $key , $value ); //这一行是导致数值改变的地方   }       if (in_array( $key , $this ->getDates()) && ! is_null ( $value )) {    return $this ->asDateTime( $value );   }     return $value ; }

查看 castAttribute 如果 >getCastType(‘id') 如果为int 则 (int)$value

?
1 2 3 4 5 6 7 8 9 10 protected function castAttribute( $key , $value ) {   if ( is_null ( $value )) {    return $value ;   }     switch ( $this ->getCastType( $key )) {    case 'int' :    case 'integer' :     return (int) $value ; //这一行

查看 >getCastType

?
1 2 3 4 protected function getCastType( $key ) {   return trim( strtolower ( $this ->getCasts()[ $key ])); }

getCasts

最中改变值得代码:

?
1 2 3 4 5 6 7 8 9 10 11 public function getCasts() {     if ( $this ->getIncrementing()) { //如果Model了的$incrementing字段为True    return array_merge ([     $this ->getKeyName() => 'int' , //返回id=>'int'    ], $this ->casts);   }     return $this ->casts; }

结论

Model的$incrementing 默认为true

当我们使用id为 非自增的时候 laravel 会把字符串转为int 所以输出了0

解决方案

给模型生命的时候添加

public $incrementing=false; 即可解决

以上这篇解决laravel id非自增 模型取回为0 的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/dream_dt/article/details/79210637

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容