我非常喜欢CodeIgniter的Active Record,以及它允许我所需的所有数据库查询。
但我也一直在阅读像Doctrine这样的ORM。当我阅读Doctrine的文档时,使用Active Record似乎并不清楚,我看不出是什么让它更好(如果是)。
Doctrine允许使用Active Record无法实现的目标是什么? Doctrine能否更快,更轻松,更好地完成同样的工作?或者它是否做了Active Record无法做到的事情?
如果人们可以发布显示我们正在谈论的任务的例子,那将是最好的。
谢谢, 马修
答案 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,那么请跳过它。