解决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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
php实现的Cookies操作类实例
Sep 24 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
Dec 05 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
php中使用GD库做验证码
Mar 31 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 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
新浪新闻小偷
2006/10/09 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
客户端静态页面玩分页
2006/06/26 Javascript
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
vue实现pdf文档在线预览功能
2019/11/26 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
python中对list去重的多种方法
2014/09/18 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
Django开发的简易留言板案例详解
2018/12/04 Python
python实现dijkstra最短路由算法
2019/01/17 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
详解pandas映射与数据转换
2021/01/22 Python
党支部反对四风思想汇报
2014/10/10 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis