表示单行的模型应返回使用多行生成的数据


Should models representing a single row return data generated using multiple rows?

一些背景:

  • 这适用于在不使用任何框架的情况下构建的 MVC 应用程序,但遵循 MVC 范例。
  • 我正在使用一个名为RedBean的ORM库与数据库通信。
  • 虽然 RedBean 使用"bean"表示数据,但它支持将它们包装到模型中,因此模型可以提供自定义函数:

    $account = R::dispense('account');
    $account->name = "john";
    R::store($account);
    $account->getFormattedLastUpdatedTime('America/New_York');
    

现在的问题:

目前,模型的每个实例将代表数据库中的 1 行。如果我有一个帐户集合,那么我将有一个"帐户"模型数组。

在应用程序中,我有一个自定义配置文件字段的功能(别担心,虽然:)我没有使用 EAV(。其中一个表存储这些字段(名称、描述等(的元数据,用于为这些自定义配置文件字段生成表单字段。同样,元数据的每一行代表 1 个表单字段,每行由 1 个模型表示。

我现在希望编写一种方法,将所有这些行转换为表单对象,然后可用于呈现和处理表单。但是,这种方法应该在哪里?我最初的想法是将其放置在表示自定义配置文件字段元数据的模型中。

说明:此函数不在account模型中,而是在profile_fields_meta模型中。

问题

由于每个模型应该代表 1 行,因此让模型返回一个将从数据库中的多行生成的对象似乎有点"脏"。我说这不是最好的方法是否正确?你建议我做什么?

扩展 ArrayObject (http://php.net/manual/en/class.arrayobject.php( 或其他容器类来运行集合方法是正确的。尝试修改查询方法以返回自定义集合类中的数据,而不是数组(如果指定(。

MVC 没有任何固有的内容说"每个模型 [实例] 应该代表一行"。通常在MVC框架中,模型(至少由控制器看到(完全不了解数据存储,并且没有任何概念或直接映射到"行"。ORM不一定是这种情况,但模型不需要遵守ORM的约束。

但是,尽管如果不详细了解您的架构和实施,就很难判断,但您所描述的功能听起来并不适合您的帐户模型。事实上,在我看来,你应该考虑拥有一个"FormField"模型,这样,用Rails的说法,帐户"有很多"FormFields。

根据记录,EAV并不总是坏事,只是经常被滥用。