两个模型共享方法和相同的表? [CakePHP的]

时间:2011-06-03 17:26:15

标签: php oop cakephp models

我目前有两种型号:产品和服务。两者共享相同的表结构和相同的方法。但是,当我更新一个方法时,我将不得不对其他模型做同样的事情。而且它变得混乱,更不用说我造成了冗余,这不是最好的做法。

我知道模型可以链接到同一个表格,因此我只需在模型中添加$useTable = 'stuff'即可添加type字段。但是,我无法弄清楚如何创建“父”模型,因为每个模型都扩展了AppModel。

公平地说,我对OOP几乎一无所知,所以我可能会遗漏一些非常明显和简单的东西。

如果不知道如何将两个孩子(产品和服务)扩展到父母(Stuff),我会做的是:

$this->Stuff->type = 'product';
$products = $this->Stuff->findAvailable();

但我敢打赌,这是一种更简单,更清洁的方法。

感谢。

3 个答案:

答案 0 :(得分:4)

使用行为。正如食谱中所述:

  

模型行为是组织CakePHP模型中定义的一些功能的一种方式。它们允许我们分离可能与模型不直接相关的逻辑,但需要存在。通过提供一种简单而强大的方法来扩展模型,行为允许我们通过定义一个简单的类变量将功能附加到模型。这就是行为允许模型摆脱可能不属于他们正在建模的业务合同的所有额外权重的方式,或者在不同模型中也需要这些额外权重,然后可以推断出来。

http://book.cakephp.org/view/1071/Behaviors

该链接应该让您非常了解从哪里开始。

答案 1 :(得分:1)

你基本上使用的是Inheritability and Extendability:

可扩展:[已删除链接以符合我的noobie状态。它位于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');

(服务几乎相同)。

然后,您在Offer模型中创建所有方法,并且在这些模型中只存在唯一适合子类产品或服务的任何方法。

如果您还没有找到解决方案,我希望这会有所帮助。

答案 2 :(得分:1)

将两个模型共享的方法放到AppModel

  

这个中间类AppModel是   空的,如果你还没有创建你的   自己取自/ cake /   夹。覆盖AppModel允许   你定义的功能   应该适用于所有型号   在您的申请中。为此,你   需要创建自己的app_model.php   驻留在。的根目录中的文件   / app / folder。

您的产品和服务模型扩展了AppModel。这意味着AppModel中的所有方法都可用于它们。