我在Doctrine(1.2.4)中看到了意想不到的缓存效果.
我有几个由以下YAML定义的相关表(删除了示例中未使用的其他几个字段).只是从学生到学校的简单的1-Many关系.
School:
tableName: tblschool
columns:
sch_id:
name: sch_id as id
primary: true
autoincrement: true
type: integer(4)
sch_name:
name: sch_name as name
type: string(50)
Student:
tableName: tblstudent
columns:
stu_id:
name: stu_id as id
primary: true
autoincrement: true
type: integer(4)
stu_sch_id:
name: stu_sch_id as school_id
type: integer(4)
relations:
School:
local: school_id
foreign: id
foreignAlias: Students
Run Code Online (Sandbox Code Playgroud)
我可以创建一个简单的Doctrine(1.2.4)查询来取回学生
$result1 = Doctrine_Query::create()
->from('Student s')
->where('s.id = 1')
->execute();
Run Code Online (Sandbox Code Playgroud)
然后用.提取出相应的学校名称
foreach ($result1 as $result) { $ans[] = $result->School["name"]; }
Run Code Online (Sandbox Code Playgroud)
我现在通过以下方式修改school_id(导致关系):
foreach ($result1 as $result)
{ $result["school_id"] = 1 - $result["school_id"]; $result->save(); }
Run Code Online (Sandbox Code Playgroud)
(我已经设置了数据库,这样就可以获得另一个有效的学校ID).
如果我现在,立即,尝试访问我将获得旧学校名称的关系.我理解这一点 - 因为我没有调用refreshRelated().我发现意外的是,如果我立即进行另一个查询重复第一个
$result2 = Doctrine_Query::create()
->from('Student s')
->where('s.id = 1')
->execute();
Run Code Online (Sandbox Code Playgroud)
并得到它的结果
foreach ($result2 as $result) { $ans[] = $result->School["name"]; }
Run Code Online (Sandbox Code Playgroud)
当我检查我的数组的内容时,我发现,在这两种情况下,我都有相同的学校名称.换句话说,即使我已经完成了第二个查询并且正在查看查询结果,但关系不会刷新.
数据库中的数据很好且一致; 即适当的学生和学校.例如,第二次运行上述序列 - 在不同的程序执行中 - 使用另一个学校名称(尽管再次重复).
这个缓存来自哪里?
Cle*_*man 11
Doctrine对关系使用了一点缓存:你Student->School的Student属性存储在一个属性中,你Student->school_id的另一个属性也是如此.
当你改变你的时候Student->school_id,数据库会被查询,并且发生了Student->school_id变化,但是Student->School没有,因为补充这个对象可能是CPU /内存膨胀.
Doctrine提供了一些刷新关系的方法,但它是开发人员使用它的责任.
示例:
$student->refreshRelated('School'); //refreshes only the School relation
$student->refreshRelated(); //refreshes every relation of the $student
Run Code Online (Sandbox Code Playgroud)
但还有另一个缓存.Doctrine将所有水合物体保存在内存中,以限制请求数量.因此,当您再次查询您的学生时,您会发现您的学生Student->School没有改变.
| 归档时间: |
|
| 查看次数: |
2325 次 |
| 最近记录: |