【问题标题】:Weird PhalconPHP behavior (ORM)奇怪的 PhalconPHP 行为 (ORM)
【发布时间】:2014-07-04 10:03:37
【问题描述】:

我有两个 Phalcon\Mvc\Model(用户、城市)。每个用户都有一个城市,因此 Users 模型有一个 hasOne 关系(别名 = City)。

$User = Users::findFirst($user_id);
$name = $User->name;
$name = $User->name;
$name = $User->name;

上面的代码没问题,因为Phalcon只对数据库运行一次查询。

$User = Users::findFirst($user_id);
$city = $User->City->name;
$city = $User->City->name;
$city = $User->City->name;

上面的代码运行了 3 个查询。每次我尝试从 Cities Phalcon 获取值时,都会再次运行相同的查询。为什么?

Phalcon 1.3.2
PHP 5.5.9
PostgreSQL 9.3.4

【问题讨论】:

    标签: php phalcon


    【解决方案1】:

    我建议如下解释:

    在第一个示例中,findUser() 方法返回完整的 User 对象。它包含所有属性(来自用户数据库表的列)。所以你可以直接访问对象的属性。它还包含一些外键(表关系),但除非您需要,否则无需从这些表中获取数据(根据db性能确实合理)。

    结果 - 我们有 1 个数据库请求(findFirst())。

    在第二个示例中,您尝试通过用户对象访问相关的表数据。在这种情况下,Phalcon 每次都会额外请求使用外键从相关表中获取数据(因为 User 对象中没有城市信息)。

    结果 - 我们有 4 个数据库请求(1 个获取用户对象的请求和 3 个获取城市对象的请求)。

    【讨论】:

    • 很明显,$User->City 是空的,但它应该在我第一次尝试访问它时被初始化(填充数据),然后记录应该保存在内存中。我使用的另一个 php 框架(Kohana)就是这样工作的,而且非常合理。我不知道其他 ORM 实现如何处理这个问题,或者是否存在任何标准规则,但我认为 Phalcon 的这种方法很糟糕。
    • 如果有人感兴趣,我们已经在 Phalcon 官方论坛上开始讨论这个话题:forum.phalconphp.com/discussion/2729/possible-bug-in-orm-
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多