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