当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-31 10:34:03 浏览: 评论:0 

今天小编就为大家分享一篇解决laravel id非自增 模型取回为0 的问题,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

问题

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

样例代码:

$a=Model::find('blcu');

echo $a->id; //结果为0

原因查找

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

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

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

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

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

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

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

查看 >getCastType

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

最中改变值得代码:

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

结论

Model的$incrementing 默认为true

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

解决方案

给模型生命的时候添加

public $incrementing=false; 即可解决

Tags: laravel非自增 laravel模型

分享到: