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

Mat*_*ker 6 database orm activerecord doctrine codeigniter-2

我非常喜欢CodeIgniter的Active Record,以及它如何很好地允许我所有需要的数据库查询.

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

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

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

谢谢,马修

Zol*_*aKt 19

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

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

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

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

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

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

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


bir*_*ric 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();
    }

    // ...

}
Run Code Online (Sandbox Code Playgroud)

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

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

/** @Entity */
class User
{

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

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

    // ...

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

// Access properties
echo $user->id;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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