【问题标题】:Should I use 'Join's in models, or call other models我应该在模型中使用“加入”还是调用其他模型
【发布时间】:2013-01-19 13:41:40
【问题描述】:

我正在学习 OOPHP,我正在寻找一些“最佳实践”建议。

对于关系数据库,许多表中显然存在外键。当我为我的站点创建模型时,我试图确定是在模型中进行 JOIN 查询更好,还是让一个模型调用另一个模型更好?

调用其他模型似乎使代码更加模块化。无论是在另一个表还是另一个模型上,这两种方式似乎都会产生依赖关系。

如果我采用“调用其他模型”的方法,我似乎遇到了另一个问题:无限循环。这是我遇到的例子。我有 2 张桌子,personschool。每个person 都有一个最喜欢的学校,用schoolId 表示。每个school 都有一个principal,即personId

该行映射到的person 对象在其构造函数中接受school 对象,但学校行映射到的school 对象在其构造函数中接受person 对象。

根据我的发现,延迟加载似乎是解决方案,但是(我可能错了)如果我这样做,我似乎无法使用 PHP 的类型提示。

(我猜很多人会向我推荐像 Doctrine 这样的 ORM 工具,而且我肯定会在未来研究它。我现在正在避免它,因为它被认为是陡峭的学习曲线,并且因为我觉得我理解如果我自己尝试一次,这些工具以后会更好)

【问题讨论】:

  • 拥有大量模型而不是连接确实会创建依赖关系,我认为这不是您想要做的。使用连接是正常的,我看不出有什么问题。
  • 但也不加入创建依赖项?如果编辑了用于大量连接的表,则必须编辑所有这些连接查询。对于许多模型,您将更新 1 个模型,并且更改会传播给调用它的每个人。

标签: php join domain-object


【解决方案1】:

好问题!我有/有同样的想法。而且我认为在查看框架之前开始自己编写代码是一个非常好的主意:)

当我编写模型生成器时,我曾决定不使用 JOINS 并使用“延迟加载”。意思是我有这样的类(只是伪代码):

class Person extends Model_Resource {

    /**
     *
     */
    protected $name;

    /**
     * @var Address <-- external reference
     */
    protected $address;

    /**
     * @return Person
     */
    public static function select($filter) {
        return DB::instance(filter_query('SELECT * FROM `person`', $filter));
    }


    /**
     * @return Address
     */
    public function getAddress() {
        // lazy loading :
        if(is_null($this->address)) {
            $this->address = Address::select(new Filter('p_id', $this->id));
        }
        return $this->address;
    }

}

多年来,这对我来说在中等规模的应用程序中效果很好。当我真的需要加快速度或使用有点不规则的查询时,我可以随意覆盖自动生成的方法并使用 JOINS、UNION 等...

我很好奇别人会怎么说。

【讨论】:

  • 我承认我最近开始使用 CodeIgniter。它的表单验证是真正卖给我的。我本可以花几天时间进行自己的验证,而它在几分钟内就完成了。
  • 我没有告诉过,不要使用它们。如果您对它感到满意,那么当然可以使用框架! ;)
  • 您发布的代码提出了另一个有趣的观点。我遇到过几个人,他们喜欢将 MVC 模式分成 1 个(伪)层,我见过的东西叫做“实体”。例如,我将有一个 person 类,它简单地存储像 firstName,lastName, email` 这样的信息,以及像 getName() 这样的简单帮助方法,它将连接和大写名字和姓氏。然后让 personModel 实际执行 DB 交互并创建 person 类。我其实很喜欢这种方法,并使用它。但这使得延迟加载更加困难。想法?
  • 我认为不是。我用'same?'方法。在我的应用程序中,有一个自动生成的 BasePerson,其中包含数据库代码 + 简单的设置/获取操作和 Person,它扩展了 BasePerson 并将包含程序员编写的代码。我认为延迟加载没有问题。在我的应用程序中,它是在 BasePerson 中完成的。顺便说一句,我认为编写这样的东西真的很有趣!!! :)
  • 当我在阅读其他一些cmets时,一个想法发生了。不使用 JOINS 会使数据排序变得更加困难。它必须使用 PHP 而不是 SQL 排序来完成。你是如何解决这个问题的?或者排序对您的应用程序来说不是什么大问题?
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多