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

Posted

技术标签:

【中文标题】表示单行的模型是不是应该返回使用多行生成的数据?【英文标题】:Should models representing a single row return data generated using multiple rows?表示单行的模型是否应该返回使用多行生成的数据? 【发布时间】:2012-05-21 23:25:47 【问题描述】:

一些背景:

这适用于在不使用任何框架但遵循 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 行,让模型返回一个从数据库中的 MULTIPLE 行生成的对象似乎有点“脏”。我是否正确地说这不是最好的方法?你建议我做什么?

【问题讨论】:

【参考方案1】:

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

【讨论】:

在集合中,您可以为对象存储额外的元数据,然后将整个集合传递给表单构造方法。【参考方案2】:

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

但是,尽管如果不了解更多有关您的架构和实现的信息就很难判断,但您所描述的功能听起来并不适合您的 Account 模型。事实上,在我看来,您应该考虑使用“FormField”模型,这样,用 Rails 的说法,Account“有很多”FormField。

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

【讨论】:

我已经添加了一些说明,表单生成的方法不会存在于account 模型中,而是存在于profile_fields_meta 模型中。但是,由于每个模型也对每一行表示 CRUD,这种方法在模型中是否合适?

以上是关于表示单行的模型是不是应该返回使用多行生成的数据?的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01427 单行子查询返回多行 - 如何解决?

SQL Group By - 将结果作为单行而不是多行返回(展平结果)

如何将多行合并为表中的单行

ORA-01427: 单行子查询在显示输出时返回多行

python中的注释

Solr上的数据导入失败,带有SQLException:单行子查询返回多行