php - 存储库模式与 ORM

标签 php orm repository-pattern

当您拥有 ORM 时,存储库模式有什么好处?

例子。假设我有以下(虚构的)表格:

表:用户

pk_user_id
fk_userrole_id
username

表:用户角色

fk_userrole_id
role

现在有了 orm,我可以简单地将其放入模型文件中:

$user = ORM::load('users', $id);

现在 $user 已经是我的对象,可以很容易地延迟加载:

(如果事情自动单数/复数会更好)

foreach ( $user->userroles()->role as $role )
{
    echo $role;
}

现在有了存储库模式,我必须为用户创建一个存储库,为角色创建一个存储库。存储库还需要各种功能来为我检索数据并存储它。另外,它需要与实体模型一起使用。所以我也必须创建所有这些。

对我来说,看起来很多东西都在做......当我可以像上面描述的那样使用 ORM 简单地获取数据时。我可以同样轻松地存储它:

ORM::store($user);

在这种情况下,它不仅会将用户对象存储到数据库中,还会将我对“角色”对象所做的任何更改也存储到数据库中。所以不需要像存储库模式那样做任何额外的工作......


所以我的问题基本上是,为什么我要将存储库模式与 ORM 一起使用?我看过教程在哪里使用该模式(比如 Doctrine)。但它对我来说真的没有任何意义......任何人都可以解释它与 ORM 结合使用......??

最佳答案

ORM 是存储库的实现细节。 ORM 只是让以 OOP 友好的方式访问数据库表变得容易。就是这样。

存储库抽象持久性访问,无论它是什么存储。这就是它的目的。您使用的是 db 或 xml 文件或 ORM 的事实并不重要。存储库允许应用程序的其余部分忽略持久性细节。这样,您可以通过模拟或 stub 轻松测试应用程序,并且可以根据需要更改存储。今天您可能会使用 MySql,明天您将想要使用 NoSql 或 Cloud Storage。用 ORM 做到这一点!

存储库处理域/业务对象(从应用程序的角度来看),ORM 处理数据库对象。业务对象不是数据库对象,首先具有行为,其次是美化的 DTO,它仅保存数据。

编辑 您可能会说存储库和 ORM 都抽象了对数据的访问,但细节决定成败。存储库抽象了对所有存储问题的访问,而 ORM 抽象了对特定 RDBMS

的访问

简而言之,存储库和 ORM 有不同的用途,正如我上面所说的,ORM 始终是存储库的实现细节。

您还可以检查this post有关存储库模式的更多详细信息。

关于php - 存储库模式与 ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155517/

相关文章:

php - 我的 Doctrine 实体应该实现接口(interface)吗?

php - Cron Job (PHP) --> 选择明年的记录不起作用

c# - NHibernate通过代码映射——复合唯一索引

java - Controller 、实体类或 dao - 什么去哪里?

winforms - 在 WinForms MDI 中使用具有存储库模式的 Entity Framework

entity-framework - Entity Framework 、LINQ 和泛型

c# - 使现有实体实现 TableEntity

javascript - 如何将 Google Analytics 对象放入 PHP 脚本之间的 $_SESSION 变量中? (非对象错误)

java - Ebean ManyToMany 与桥表查找所有查询

javascript - JQuery DataTables 和 Jeditable - 字段包含 html 但不应该。为什么?