解决laravel id非自增 模型取回为0 的问题

问题

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 的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Laravel统计一段时间间隔的数据方法

    获取七天以前到现在的数据: $days = Input::get('days', 7); $range = \Carbon\Carbon::now()->subDays($days); $stats = User::where('created_at', '>=', $range) ->groupBy('date') ->orderBy('date', 'DESC') ->get([ DB::raw('Date(created_at) as date'), DB::raw('

  • 解决Laravel 使用insert插入数据,字段created_at为0000的问题

    据官方文档的说明,使用Eloquent ORM,插数据库的时候可以自动生成created_at,updated_at,代码如下: Model里的代码: <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Notice extends Model { protected $guarded = []; //获取部门名称 public function fromDep(){ return $this->b

  • laravel按天、按小时,查询数据的实例

    使用laravel做后台数据统计的时候,需要查询每天的注册量之类的数据 这时候如果直接用created_at分组,是不好用的. 1.所以本文解决这个查询应该怎么写. 2.并且推荐一个时间选择插件,因为统计中一定会用到,本周数据.本月.本季度.上个月.... 按天分组数据: Event::where('created_at','>',Carbon::parse($request->start_date)) ->where('created_at','<',Carbon::parse(

  • laravel实现按月或天或小时统计mysql数据的方法

    在PHP里怎么比较简单的实现按时间(如按月,按天,按小时)来统计表里的数据呢? 如:要实现获取下图曲线图数据(ps:当然也可能是柱状图等,数据都是一样的),默认获取七天内的数据,点击今天,7天,15天,30天可任意切换,其中今天是按小时统计. 不过我的实现方法有一个小缺点,当某个小时内是没有数据的,那么该小时不会出现,不过这个应该可以通过前端的形式弥补 好了,废话不多说,上图上代码! 1. 控制器内容 /** * [getsellerdata 获取某时间段内商户结算查询数据] * @param

  • 解决laravel id非自增 模型取回为0 的问题

    问题 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" 也就是数据其实是读取出来了 只是

  • mybatis-plus添加数据时id自增问题及解决

    目录 mybatis-plus添加数据时id自增问题 解决方案 插入记录的主键自增赋值机制说明 代码说明 1.找到执行入口 2.看看keyGenerator的执行逻辑 3. 跟进逻辑执行 4.继续进入下一层逻辑 5.继续进入下一层逻辑 6.关键取值 7.关键赋值 自增主键 UUID mybatis-plus添加数据时id自增问题 mybatis-plus插入数据,id自增列变的很长.比如下图: mybatis-plus中遇到一个,添加数据到数据库,而数据库中的id列是自增列 使用plus中自带的

  • 详解Laravel设置多态关系模型别名的方式

    作为 Laravel 的重度使用者肯定都对多态关系不默生,以官方文档为例,文章有标签,视频有标签,那么文章和视频这些模型与标签模型的关系就是 多态多对多(Many To Many (Polymorphic)) 如果我们给 ID 为 1 的文章打上两个标签,数据库标签关系表的的存储结果就是这样子: > select * from taggables; +--------+-------------+---------------+ | tag_id | taggable_id | taggable

  • 三个思路解决laravel上传文件报错:413 Request Entity Too Large问题

    最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报错页面时,你会发现有nginx版本信息,经过分析,这报错是因为nginx的默认上传文件大小配置client_max_body_size只有2MB, 基于nginx验证比laravel验证要早,想要友好报错而不是直接显示413 Request Entity Too Large,那么就有三个思路去解决.

  • 解决laravel groupBy 对查询结果进行分组出现的问题

    使用laravel groupBy方法时不知为什么一直出现语法错误,查了很多资料才找到原因: $data = Orders::select("orders.*","user.name","orderstatu.name as ssname") ->join("user","user.id","=","orders.uid") ->join("or

  • django models里数据表插入数据id自增操作

    models 建表实现插入数据自增ID 之前使用 Id = models.IntegerField(primary_key=True,default = '1') 每次数据插入进去都会更新一次,并且Id都为1,就变成update,而不是insert 改成这样 id = models.AutoField(primary_key=True) django 在每一次save()操作后都可以正常的增加一条数据并且id顺序自增 id无需在save中创建,数据表自动添加 补充知识:Django查询 – id

  • 图文详解laravel多对多关联模型

    关联模型(多对多) 多对多关系(抽象) 例:一篇文章可能有多个关键词,一个关键词可能被多个文章使用. 关键词表: 字段id 主键 字段keyword 关键词 文章与关键词的关系表: 字段id 主键 -- -- 字段article_id 文章id 字段key_id 关键词id 创建迁移文件: php artisan make:migration create_keyword_table php artisan make:migration create_relation_table 编写迁移文件的

  • 解决laravel 5.1报错:No supported encrypter found的办法

    本文主要介绍了关于解决laravel 5.1报错:No supported encrypter found的办法,分享出来供大家参考学习,下面来看看详细的介绍: 问题描述 在使用laravel5.1进行项目开发的时候,出现了"No supported encrypter found. The cipher and / or key length are invalid."的报错信息,导致页面无法显示. 网上的绝大多数答案都是直接执行PHP artisan key:generate即可.

  • 解决laravel 出现ajax请求419(unknown status)的问题

    如下所示: 这个是因为laravel自带CSRF验证的问题 解决方法 方法一:去关掉laravel的csrf验证,但这个人不建议,方法也不写出来了. 方法二:把该接口写到api.php上就好了 方法三: 首先在页面加上 <meta name="csrf-token" content="{{ csrf_token() }}" /> 然后请求的在header里面加上 'X-CSRF-TOKEN': $('meta[name="csrf-token&

随机推荐