Doctrine在Active Record上面添加了什么 - CodeIgniter?

时间:2012-01-12 16:01:56

标签: database activerecord orm doctrine codeigniter-2

我非常喜欢CodeIgniter的Active Record,以及它允许​​我所需的所有数据库查询。

但我也一直在阅读像Doctrine这样的ORM。当我阅读Doctrine的文档时,使用Active Record似乎并不清楚,我看不出是什么让它更好(如果是)。

Doctrine允许使用Active Record无法实现的目标是什么? Doctrine能否更快,更轻松,更好地完成同样的工作?或者它是否做了Active Record无法做到的事情?

如果人们可以发布显示我们正在谈论的任务的例子,那将是最好的。

谢谢, 马修

2 个答案:

答案 0 :(得分:19)

首先,你在说什么教义,1或2? 这是个很大的差异。两者的共同点就是它们都是完整的ORM-s。否则两者之间确实没有任何联系。

Doctrine 1基于 ActiveRecords ,Doctrine 2基于 Data mapper 模式。
两者都可以做同样的事情,但两者之间存在一些显着差异。

一般来说,数据映射器不太“开发人员友好”,但应该具有更好的性能。为什么?实际上它非常简单。使用活动记录,每个实体都知道“周围”本身的一切,与其他实体的关系等。对于数据映射器,实体是哑的和轻量级的,有一个中心实体(Doctrine2中的EntityManager / UnitOfWork)处理所有关系映射。因此,在内存使用和性能方面,数据映射器应该更快 Doctrine的人说Doctrine2比Doctrine1快了至少50%(还有其他差异,而不仅仅是设计模式)。

如果你觉得它,你甚至可以通过Doctrine2数据映射器实现ActiveRecords。看看这个blog post。我只是在开发阶段使用这种方法,以尽可能少地保存代码。一旦它投入生产,我将杀死额外的ActiveRecords层,并回滚到Doctrine2的默认数据映射器。

所以结论是你可以用两者做任何事情,但你可以说你可以用原始SQL做任何事情。如果您是ORM世界的初学者,我建议使用ActiveRecords,因为它很简单并且(通常)需要更少的代码。另一方面,如果您正在构建一个大型复杂模型,我认为数据映射器是更好的选择。

也许我弄错了,但这就是我理解它的方式。

至于CodeIgniters ActiveRecords和Doctrine(1或2)之间的比较,我不能说,因为我从未使用过CodeIgniter。有一件事我确信,Doctrine比CodeIgniters默认的ORM有更多的功能。例如:结果水合,继承(单表,类表),预取,延迟加载,额外延迟加载,扩展,行为,优化,代理,日期时间处理......这是一个庞大而成熟的ORM,有很多功能,虽然我对任何“默认框架ORM”的体验是他们的主要目标是尽可能简单,所以新手可以很容易地掌握它。 Doctrine是一个强大的野兽,并且肯定可以以比内置CodeIgniter ORM更高效和/或逻辑更正确的方式做很多事情。缺点是,它需要更多的时间来学习和编写代码,它是一个庞大的库,拥有数千个文件,所以只是为了让所有内容都运行起来,与更轻的替代方案相比会增加一些开销。

答案 1 :(得分:9)

Doctrine是一个成熟的ORM,它实现了活动的记录模式。 CodeIgniter的活动记录类是一个查询构建器/数据库包装器,它基于模式的“修改”版本。

免责声明:我从未使用过Doctrine。根据我的理解,我将尽力说明CodeIgniter的活动记录实现与Doctrine之间的区别。

使用CodeIgniter的活动记录类,您可以实现如下模型:

class User_model extends CI_Model
{

    public function get_user_by_username($username)
    {
        // Build query using active record methods
        $this->db->where('username', $username);
        $this->db->where('active', 1);

        // Execute query
        $query = $this->db->get('users');

        // Return results
        return $query->result();
    }

    // ...

}

您基本上是使用活动记录方法构建查询。很容易看出每个方法(where()get()等)如何映射到原始SQL。使用活动记录方法而不仅仅是$this->db->query()的优点是CodeIgniter根据您使用的数据库驱动程序编译每个查询。除此之外,CodeIgniter的主动记录实现并没有真正做多少。您需要创建所需的任何查询。我希望我已经说明了活动记录方法与查询构建器的相似之处。

请注意,以下示例代码可能不正确。使用Doctrine,你可能有这样的模型:

/** @Entity */
class User
{

    /** @Column(type="integer") */
    private $id;

    /** @Column(length=50) */
    private $username;

    // ...

}

然后,要使用模型和相关的活动记录功能,您可以执行以下操作:

// Instantiate object
$user = new User();

// Set properties
$user->username = 'some_username';

// Save object
$user->save();

// Access properties
echo $user->id;

这只是表达了Doctrine可以做的事情。您可以为属性设置默认值或指定表之间的关系。请注意我没有编写任何SQL或构建查询。我只是设置对象的属性,然后保存它。学说处理其余的事情。

请注意,Doctrine包含自己的查询构建器,因此在某种程度上它可以执行CodeIgniter的活动记录,以及更多。

使用Doctrine类似于CakePHP或Ruby on Rails实现的活动记录模式。您可以在那里查看有关该模式的其他信息。如果您来自CodeIgniter背景,CakePHP的示例可能特别容易消化。

为了回答你的其他一些问题,我认为没有任何东西可以使Doctrine比CodeIgniter主动记录方法更好。它可能更高级,但与任何其他库一样,您希望为工作选择最佳工具。如果您对CodeIgniter的活动记录方法感到满意,并且您认为不需要高级ORM,那么请跳过它。