我非常喜欢CodeIgniter的Active Record,以及它如何很好地允许我所有需要的数据库查询.
@H_403_2@但我也一直在阅读像Doctrine这样的ORM.当我阅读Doctrine的文档时,使用Active Record似乎并不清楚,我看不出是什么让它更好(如果是).
@H_403_2@什么是Doctrine允许使用Active Record无法实现的? Doctrine能否更快,更轻松,更好地完成同样的工作?或者它做的事情Active Record不能做?
@H_403_2@如果人们可以发布显示我们正在谈论的内容的任务示例,那将是最好的.
@H_403_2@谢谢,
马修
马修
解决方法
Doctrine是一个完整的ORM,它实现了活动记录模式. CodeIgniter的活动记录类是一个查询构建器/数据库包装器,它基于模式的“修改”版本.
@H_403_2@免责声明:我从未使用过Doctrine.根据我的理解,我将尽力说明CodeIgniter的活动记录实现与Doctrine之间的区别.
@H_403_2@使用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(); } // ... }@H_403_2@您基本上使用活动记录方法构建查询.很容易看出每个方法(where(),get()等)如何映射到原始sql.使用活动记录方法而不仅仅是$this-> db-> query()的优点是CodeIgniter根据您使用的数据库驱动程序编译每个查询.除此之外,CodeIgniter的主动记录实现并没有真正做多少.您需要创建所需的任何查询.我希望我已经说明了活动记录方法与查询构建器的相似之处. @H_403_2@请注意,以下示例代码可能不正确.使用Doctrine,你可能有这样的模型:
/** @Entity */ class User { /** @Column(type="integer") */ private $id; /** @Column(length=50) */ private $username; // ... }@H_403_2@然后,要使用模型和关联的活动记录功能,您可以执行以下操作:
// Instantiate object $user = new User(); // Set properties $user->username = 'some_username'; // Save object $user->save(); // Access properties echo $user->id;@H_403_2@这只是学说可以做什么的表面.您可以为属性设置默认值或指定表之间的关系.请注意我没有编写任何sql或构建查询.我只是设置对象的属性,然后保存它.学说处理其余的事情. @H_403_2@请注意,Doctrine包含自己的查询构建器,因此在某种程度上它可以执行CodeIgniter的活动记录,以及更多. @H_403_2@使用Doctrine类似于CakePHP或Ruby on Rails实现的活动记录模式.您可以在那里查看有关该模式的其他信息.如果您来自CodeIgniter背景,CakePHP的示例可能特别容易消化. @H_403_2@为了回答你的其他一些问题,我认为没有任何东西可以使Doctrine比CodeIgniter主动记录方法更好.它可能更高级,但与任何其他库一样,您希望为工作选择最佳工具.如果您对CodeIgniter的活动记录方法感到满意,并且您认为不需要高级ORM,那么请跳过它.