[英]Two models with shared methods and same table? [CakePHP]
我目前有两个模型:产品和服务。 两者共享相同的表结构和相同的方法。 但是,当我更新一种方法时,我必须对另一种 model 执行相同的操作。 它变得一团糟,更不用说我造成了冗余,这不是可用的最佳实践。
我知道模型可以链接到同一个表,所以我只需要在 model 中添加一个$useTable = 'stuff'
并且我可以添加一个type
字段。 但是,我无法弄清楚如何创建“父”model,因为每个 model 都扩展了 AppModel。
公平地说,我对 OOP 几乎一无所知,所以我可能会遗漏一些非常明显和简单的东西。
在不知道如何将两个孩子(产品和服务)扩展到父母(东西)的情况下,我会做的事情是:
$this->Stuff->type = 'product';
$products = $this->Stuff->findAvailable();
但我敢打赌,有一种更简单、更清洁的方法。
谢谢。
使用行为。 如食谱中所述:
Model 行为是一种组织 CakePHP 模型中定义的一些功能的方法。 它们允许我们分离可能与 model 没有直接关系但需要存在的逻辑。 通过提供一种简单而强大的方式来扩展模型,行为允许我们通过定义一个简单的 class 变量来将功能附加到模型。 这就是行为允许模型摆脱所有额外权重的方式,这些权重可能不属于他们正在建模的业务合同的一部分,或者不同模型也需要这些额外的权重,然后可以进行推断。
http://book.cakephp.org/view/1071/Behaviors
该链接应该让您很好地了解从哪里开始。
您基本上使用的是可继承性和可扩展性:
可扩展:[删除链接以符合我的新手状态。 它在下面来自 gitub 的文件中]
其中被纳入: https://github.com/CakeDC/utils/blob/master/models/behaviors/inheritable.php
我只是使用了同样的方法(也适用于产品和服务)。 实际上,我对每个公共字段和子类型(2 类产品和 3 类服务)都有不同的字段,因此我创建了 Offer model 并带有一个如下所示的优惠表:
CREATE TABLE `offers` (
`id` int(11) NOT NULL AUTO_INCREMENT, //common
`carrier_id` int(11) DEFAULT NULL, //common
`category_id` int(11) DEFAULT NULL, //common
`name` varchar(255) DEFAULT NULL, //common
`description` longtext, //common
`type` ENUM('Product', 'Service') not null default 'Product',
`sku` varchar(255) DEFAULT NULL, //product
`make` varchar(255) DEFAULT NULL, //product
`model` varchar(255) DEFAULT NULL, //product
`listprice` decimal(9,2) DEFAULT NULL, //product
`soc_code` varchar(255) DEFAULT NULL, //service
`unit` varchar(255) DEFAULT NULL, //service
`units` int(11) DEFAULT NULL, //service
`mrc` decimal(9,2) DEFAULT NULL, //service
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `carrier_id` (`carrier_id`),
KEY `category_id` (`category_id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后我的报价 model 看起来像这样:
<?php
class Offer extends AppModel {
public $name = 'Offer';
public $useTable = 'offers';
public $displayField = 'name';
public $belongsTo = array(
'Carrier' => array(
'className' => 'Carrier',
'foreignKey' => 'carrier_id',
),
'Category' => array(
'className' => 'Category',
'foreignKey' => 'category_id',
)
);
使用产品 model:
<?php
App::import('Model', 'Offer');
class Product extends Offer {
public $name = 'Product';
public $useTable = 'offers';
public $displayField = 'name';
public $actsAs = array('utils.inheritable');
(服务实际上是相同的)。
然后,您在 Offer model 中创建所有方法,并且在这些模型中只存在任何适合子类产品或服务的东西。
如果您还没有找到解决方案,我希望这会有所帮助。
将两个模型共享的方法放入您的AppModel :
这个中间 class AppModel 是空的,如果您还没有创建自己的,则从 /cake/ 文件夹中获取。 覆盖 AppModel 允许您定义应该对应用程序中的所有模型可用的功能。 为此,您需要创建自己的 app_model.php 文件,该文件位于 /app/ 文件夹的根目录中。
您的产品和服务模型扩展了 AppModel。 这意味着 AppModel 中的所有方法都可供他们使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.