解决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 木马攻击防御技巧
Jun 13 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
phpize的深入理解
Jun 03 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
Git命令之分支详解
2021/03/02 PHP
js字符编码函数区别分析
2011/12/28 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
浅析JavaScript动画
2015/06/10 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
SVG实现时钟效果
2018/07/17 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python重试装饰器示例
2014/02/11 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
python实现装饰器、描述符
2018/02/28 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Python如何实现线程间通信
2020/07/30 Python
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
Weblogc domain问题
2014/01/27 面试题
历史教育专业个人求职信
2013/12/13 职场文书
小学生检讨书大全
2014/02/06 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
成立公司计划书
2014/05/07 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
2015年度企业工作总结
2015/05/21 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python