解决laravel id非自增 模型取回为0 的问题
发布:smiling 来源: PHP粉丝网 添加日期:2021-12-31 10:34:03 浏览: 评论:0
今天小编就为大家分享一篇解决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; 即可解决
Tags: laravel非自增 laravel模型
相关文章
- ·Laravel模型事件的实现原理详解(2021-09-05)
- ·Laravel模型间关系设置分表的方法示例(2021-09-11)
- ·Laravel框架模型的创建及模型对数据操作示例(2021-11-21)
- ·Laravel 模型关联基础教程详解(2021-12-18)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)