刘少星


人的一切痛苦,本质上都是对自己无能的愤怒。加油!


welcome to mine blog !

Laravel 关联模型由于名称一致性导致的问题

1. 定义关联模型

在Laravel里面,我们可以通过定义以下Model来完成关联查询。

class MyPost extends Eloquent {
    public function myPostInfo () {
        return $this->hasOne('MyPostInfo');
    }
}

class MyPostInfo extends Eloquent {}

2. 使用关联模型

这里myPostInfo()用的是Camel命名规则,但是我们在读取某一个PostInfo的时候可以用Snake规则。如下面代码都是可行的:

$post = MyPost::find(1);
$post_info = $post->myPostInfo; // example 1
$post_info = $post->my_post_info; // example 2

Laravel允许上述两种方法,但是没有合理的处理使用两种命名造成的冲突。

3. 缓存失效

如果我们同时使用了上述两个例子,就会使其中一个缓存失效。在Model的relations变量中,缓存了已经读取过的关联Model,但是当我们用不同规则的名字去读取的时候,却会使得前一个缓存失效。例如

$post_info = $post->myPostInfo; 
// $post->relations = [‘myPostInfo’ => ..];

$post_info = $post->my_post_info;
// $post->relations = [‘myPostInfo’ => …, ‘my_post_info’ => …];

所以如果不希望缓存失效,得在项目中只使用一种命名方法去读取关系模型。Laravel推荐的是Camel Case.

4. toArray() 方法失效

如果同时使用了两者,另外一个问题就是导致Model::toArray()失效。因为toArray()方法首先去relations中查找Snake Case命名的关联模型,没有的话才去看Camel Case的。

所以如果用到了toArray()方法来转换Model,切忌同时使用两者。

5. 容易犯错的位置

最容易犯错的代码是这样的:

MyPost::with(‘myPostInfo’)->get();

在使用With去eagerLoad关联模型时,必须使用和定义方法同名的key去读取,那么这样读取出来的方法只能是Camel Case的key。其他地方就只能用

$my_post->myPostInfo;

来保证不出问题。

最近的文章

交互式编程-IPython

IPython简介IPython最大的特性是它的交互式翻译器。这个系统允许我们以最快的速度测试自己的想法,而不是创建一个文件然后编译执行。IPython的目标是创建一个交互式计算和探索式计算的全面环境。为了支持这个目标,IPython有两个重要组件:一个增强的交互式python shell一个交互式的并行计算架构参考:IPython Introduction安装IPythonubuntu下直接apt-get install ipython即可,其他可以参考install ipython使用...…

Python继续阅读
更早的文章

Laravel 核心:控制反转(Inversion of Control)和门面模式(Facade)

这两个概念对于 Laravel 的使用者来说应该并不陌生,尤其是当你希望扩展或者替换 Laravel 核心库的时候,理解和合理使用它们可以极大提升 Laravel 的战斗力。这里以创建一个自己的 ServiceProvider 为例理解 Inversion of Control 和 Facade 在 Laravel 中的应用。控制反转(Inversion of Control)什么是 IoC控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,...…

PHPLaravel继续阅读