解决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 相关文章推荐
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
PHP 防注入函数(格式化数据)
Aug 08 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
yii2 resetful 授权验证详解
May 18 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
Oct 20 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 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漏洞全解(详细介绍)
2012/11/13 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
Python的Django框架中的Context使用
2015/07/15 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
详解Python 函数如何重载?
2019/04/23 Python
python挖矿算力测试程序详解
2019/07/03 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
golang 实现两个结构体复制字段
2021/04/28 Golang
Python实现单例模式的5种方法
2021/06/15 Python
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
Golang并发工具Singleflight
2022/05/06 Golang