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


Posted in PHP onOctober 11, 2019

问题

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

样例代码:

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

原因查找

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

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

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

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

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

protected function castAttribute($key, $value)
 {
  if (is_null($value)) {
   return $value;
  }

  switch ($this->getCastType($key)) { 
   case 'int':
   case 'integer':
    return (int) $value; //这一行

查看 >getCastType

protected function getCastType($key)
 {
  return trim(strtolower($this->getCasts()[$key]));
 }

getCasts

最中改变值得代码:

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 的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP5/ZendEngine2的改进
Oct 09 PHP
php中截取中文字符串的代码小结
Jul 17 PHP
基于php下载文件的详解
Jun 02 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
php的一个简单加密解密代码
Jan 14 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
Symfony2实现在controller中获取url的方法
Mar 18 PHP
PHP保留两位小数的几种方法
Jul 24 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 #PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 #PHP
laravel 中某一字段自增、自减的例子
Oct 11 #PHP
laravel框架的安装与路由实例分析
Oct 11 #PHP
php5与php7的区别点总结
Oct 11 #PHP
laravel 关联关系遍历数组的例子
Oct 10 #PHP
laravel请求参数校验方法
Oct 10 #PHP
You might like
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
基于header的一些常用指令详解
2013/06/06 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
利用js对象弹出一个层
2008/03/26 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
json前后端数据交互相关代码
2018/09/19 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
python根据出生日期返回年龄的方法
2015/03/26 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
python代码xml转txt实例
2020/03/10 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
标准毕业生自荐信范文
2013/11/04 职场文书
董事长秘书工作职责
2014/06/10 职场文书
球队口号
2014/06/18 职场文书
《司马光》教学反思
2016/02/22 职场文书
python flask框架快速入门
2021/05/14 Python