解决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 相关文章推荐
php中对xml读取的相关函数的介绍一
Jun 05 PHP
php上传文件的增强函数
Jul 21 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
Jul 03 PHP
浅析关于PHP位运算的简单权限设计
Jun 30 PHP
php实现mysql封装类示例
May 07 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
推荐十款免费 WordPress 插件
Mar 24 PHP
php自定义urlencode,urldecode函数实例
Mar 24 PHP
详解php语言最牛掰的Laravel框架
Nov 20 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
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
PHP无限分类的类
2007/01/02 PHP
PHP获取网卡地址的代码
2008/04/09 PHP
PHP的加密方式及原理
2012/06/14 PHP
phpize的深入理解
2013/06/03 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
详解Python中的动态属性和特性
2018/04/07 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
Django分页功能的实现代码详解
2019/07/29 Python
Python银行系统实战源码
2019/10/25 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
python列表推导式入门学习解析
2019/12/02 Python
python opencv如何实现图片绘制
2020/01/19 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
中专毕业自我鉴定
2013/10/16 职场文书
岗位职责的含义
2013/11/17 职场文书
婚前协议书范本两则
2014/10/16 职场文书
初中团委工作总结
2015/08/13 职场文书
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技