0

我有 3 张包含用户信息的表格,一张给学生,一张给老师,一张给管理员。

它们没有任何关系。我不想为管理员创建仪表板,其中会显示学生和教师的列表。

我发现实现这一点的唯一方法是使用$uses管理员控制器中的变量。但是,我在很多地方读到这是不好的做法。

有什么解决办法吗?

4

3 回答 3

3

另一个,也许更好的做法是使用ClassRegistry::init('MyModel')->myMethod()更多阅读@Cake API

这仅在使用对象时加载对象,而不是loadModelor usesClassRegistry模型被视为单例。

--

您做错了什么:您需要访问与当前控制器无关的模型。

在很多情况下,您需要从一个控制器访问所有模型数据,但从来没有一个明确的答案来说明如何在不违反约定的情况下做到这一点!

于 2011-07-31T10:56:12.780 回答
2

您始终可以使用另一个不相关的模型

    $this->loadModel('NewModelName');

然后您可以通过以下方式访问新加载的模型:

    $this->NewModelName->add();    // whatever method model has defined

为什么更喜欢 loadModel() 而不是使用?

获得业绩。如何?uses 调用 loadModel 函数本身来加载您在 uses 数组中指定的所有模型。但问题是,如果只有一个动作需要特定的模型,那么在每个动作中都包含它有什么好处。例如,只有 add() 动作需要一个不相关的模型,但是如果您在 uses 数组中指定了它,那么无论调用什么动作,都会加载一个完全不相关的模型。简单地说,这将是低效的。就像您在 C 程序中声明了变量但从未使用过它们。万一C编译器会警告你你没有使用你的变量,但不幸的是蛋糕不能告诉你。

如果您的所有操作都需要加载该模型,则可以使用使用,否则使用 loadModel()。

于 2011-07-31T03:03:40.887 回答
1

您可能没有在其他问题中阅读我的答案:))

我有 3 张包含用户信息的表格,一张给学生,一张给老师,一张给管理员。它们没有任何关系。我不想为管理员创建仪表板,其中会显示学生和教师的列表。

问题是您将相似的数据分成 3 个不同的表,在这种情况下是用户信息。因此,当您尝试管理这些数据时,您遇到了一堵墙:因为当您将它们分隔在 3 个表中时,您忽略了这些关系。

我发现实现此目的的唯一方法是在 Administrators 控制器中使用 $uses 变量。

你对控制器有错误的想法。每个控制器管理特定模型(和相关模型)的数据流。这并不意味着您必须留在管理控制器中才能执行管理操作。您要操作的模型决定了您需要使用的控制器。

但是,我在很多地方读到这是不好的做法。

现在主要问题是:使用 $uses 是一个危险信号,表明您做错了:您需要访问与当前控制器无关的模型。现在,编程中总是有例外,有时我们需要访问该模型。这就是 loadModel 的用武之地。因为它应该很少见。如果你需要模型很多,那么你需要调用 loadModel 很多,这很麻烦,这就是 $uses 的用途,但这意味着你的应用程序设计有问题:))

因此,您可以说使用 $uses 是错误决定的标志(在数据库设计或应用程序结构中);所以使用 loadModel 很多。

编辑:Any solutions? 我在你的另一个问题中给出了一个解决方案。但是如果你想把它们都放在一个地方,你可以有 1 个包含用户信息的用户表。每个用户可以有一个学生、教师、管理员和一个“组”字段来决定用户是什么组。第三种解决方案是使用 $uses。它的性能影响真的不是问题。但是当你进一步开发你的应用程序时,它会非常复杂。这就是你需要担心的。例如,我可以说,如果您使用 Auth,则需要对其进行一些调整以使其与 3 个模型一起使用。如果使用 users 表,会容易很多。

于 2011-07-31T06:49:25.307 回答