Laravel Eloquent ORM 数据更新

Reading time ~1 minute

最近在用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语句多好!!!

挂载网络文件夹后网络故障时文件操作命令卡死

挂载 NFS 或者 Samba 的时候,经常会由于网络故障导致挂载好的链接断掉。此时如果尝试进行 ls、cd、df 等各种命令,只要与此目录沾上边,就会卡住。如果使用了类似 oh-my-zsh 这种配置的,只要在网络目录中,弹出命令提示符前就会直接卡住。这个时候第一反应就是...… Continue reading

路由折腾记 第四弹

Published on September 02, 2017