问题
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