我应该在模特中使用'加入',还是打电话给其他模特

时间:2013-02-04 19:14:06

标签: php join domain-object

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

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

调用其他模型似乎可以使代码更加模块化。无论哪种方式似乎都创建依赖关系,无论是在另一个表还是另一个模型上。

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

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

从我发现的,关于延迟加载的东西,似乎是解决方案,但(我可能是错的)似乎我这样做我不能使用PHP的类型提示。

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

1 个答案:

答案 0 :(得分:0)

好问题!我有同样的想法。我认为在查看框架之前启动代码是一个非常好的主意:)

当我编写模型生成器时,我决定不使用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等......

我很好奇其他人会说些什么。