解决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 pack与unpack 摸板字符字符含义
Oct 29 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 PHP
thinkphp 多表 事务详解
Jun 17 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
Aug 21 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
PHP 正则表达式小结
Feb 12 PHP
试用php中oci8扩展
Jun 18 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
PHP RabbitMQ消息列队
May 11 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/01/19 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
python操作mysql数据库
2017/03/05 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
总结python中pass的作用
2019/02/27 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Django中modelform组件实例用法总结
2020/02/10 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
运动会跳远加油稿
2014/02/20 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
行政专员求职信范文
2014/05/03 职场文书
房地产广告策划方案
2014/05/15 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
教师工作表现评语
2014/12/31 职场文书
事业单位岗位说明书
2015/10/08 职场文书
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
python通过新建环境安装tfx的问题
2022/05/20 Python
Django框架中表单的用法
2022/06/10 Python