Вы в основном используете наследование и расширяемость:
расширяемо: [ссылка удалена, чтобы соответствовать моему статусу новичка.Это в файле ниже от gitub]
Наследуемое: http://bakery.cakephp.org/articles/taylor.luk/2008/10/22/inheritable-behavior-missing-link-of-cake-model
, которые были включены в: https://github.com/CakeDC/utils/blob/master/models/behaviors/inheritable.php
Я только что использовал этот же метод (также для продуктови услуги).На самом деле у меня есть разные поля для каждого, общие поля, а затем подтипы (2 класса продуктов и 3 класса услуг), поэтому я создал модель предложений с таблицей предложений, которая выглядит следующим образом:
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;
Тогда моя модель предложения выглядит так:
<?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',
)
);
С моделью продукта:
<?php
App::import('Model', 'Offer');
class Product extends Offer {
public $name = 'Product';
public $useTable = 'offers';
public $displayField = 'name';
public $actsAs = array('utils.inheritable');
(Сервис практически идентичен).
Затем вы создаете всеваших методов в модели предложения, и в этих моделях будет существовать только то, что уникально подходит для продуктов или услуг подклассов.
Надеюсь, это поможет, если вы еще не нашли решение.