最近在用laravel写后台,不得不说laravel用的真爽,彻底不同于php之前给我的感觉,虽说还是对于弱类型有时候感觉有点不爽。
然而,今天用ORM更新数据库的时候却遇到个神奇的问题,laravel的文档中对于模型的更新是这样举例的:
$user = User::find(1); $user->email = 'john@foo.com'; $user->save();
方法很明确,和模型插入的例子是相似的:
$user = new User; $user->name = 'John'; $user->save();
然而,自己在使用的时候,却发生了一个神奇的现象,对于模型的插入,数据库正常插入了,可是对于模型的更新,数据库却没有正常的更新。
首先的第一反应当然是检查save的返回值,可是却发现返回的是true,就是说laravel是认为save的操作是成功执行了的。
然后我尝试了类似如下的代码:
$user = new User; $user->NAME = 'A'; $user->save(); $user->NAME = 'B'; $user->save();
执行之后发现,第二个save确实成功更新了数据库,那就更让我疑惑了。
最后折腾了半天之后,在一个朋友的帮助下,大概找出来问题所在。
我们的数据库里面字段名都是用的大写,把主键名改为小写即可解决这个问题,不得不说真是神奇,检查ORM的log会发现,在主键名大写的时候,SQL语句的是类似:
select * from `table_name` where `id` is null
而主键名小写的时候,SQL语句是类似:
select * from `table_name` where `id` = ?
也就是说,大写的时候,ORM没能成功找到主键的条件,具体ORM的源码也没时间研究,但出这种问题真是有点让人无言以对,看来这真是天都来谴责我使用ORM了,不过就是看到文档里专门大费章节写以为是推荐这样才用的,不然直接SQL语句多好!!!