MVC初学者问题 - 编辑多对多关系

时间:2009-09-03 03:38:58

标签: model-view-controller language-agnostic cakephp

我正在使用CakePHP使用MVC模式构建应用程序,但我想我的问题与语言无关。

以下是我数据的一部分概述:

ITEMS (id, name, description)
LOCATIONS (id, name)

项目表描述了一种项目(“苹果”,“橙色”,“香蕉”),而不是单个项目。

每个位置可以包含任意数量的每个项目。为了保持这种多对多关系,我有这个表:

ITEMS_LOCATIONS (id, item_id, location_id, quantity)

// eg (1, "home", "apple", 5) --> I have 5 apples at home
//    (2, "work", "apple", 2) --> I have 2 apples at work
//    (1, "home", "orange", 1) --> 1 orange at home
// (Don't worry - I have numeric ids... this is just an example)

现在我需要能够编辑这个“库存”信息,但我不确定究竟哪个型号或控制器应该处理它?

locations控制器是否应采取editInventory动作?或者items控制器应该editLocations还是什么?我应该制作一个全新的模型吗?

3 个答案:

答案 0 :(得分:1)

这确实是主观的。

您肯定希望在库存控制器上有编辑操作,以编辑库存项目详细信息,并在位置控制器上编辑操作以编辑位置详细信息。

在管理关系时,您可能想要考虑如何使用该关系 - 您通常是否可能在项目中添加位置,在这种情况下,您可能需要在Items控制器上执行AddLocation操作,或者您是否更有可能将项目添加到位置,在这种情况下,您可能希望在位置控制器上执行AddItem操作。也许你是双向的,在这种情况下,也许创建一个ItemLocations控制器并在那里工作是可行的....

HTH

答案 1 :(得分:1)

对此没有真正的硬性规定。使用最有意义的东西。

在您的情况下,您可能希望控制某个位置的商品,因此使用/location/42/items/location/42/inventory/location/42/items/edit这样的网址可能会最有意义的。因此,在LocationsController中进行适当的操作。

反过来说,如果你想控制一个项目的位置,/item/42/locations可能更有意义。

如果两者同样“重要”,您可能需要为它制作一个额外的控制器并使用/inventory/edit/42,无论具体对您意味着什么。

对于模型,您可以准备$data任一方式,以便在使用saveAll()时更新HABTM模型,或者您可以像$this->Item->ItemsLocation->save()一样直接操作HABTM模型。通常您不需要烘焙 HABTM模型,除非您需要将其连接到其他模型。

答案 2 :(得分:0)

我倾向于将位置ID传递给项目控制器,并将其作为外键存储在项目记录中。