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


Two models with shared methods and same table? [CakePHP]

我目前有两种型号:产品和服务。两者共享相同的表结构和相同的方法。但是,当我更新一个方法时,我必须对另一个模型执行同样的操作。而且它变得一团糟,更不用说我造成了裁员,而且这不是可用的最佳实践。

我知道这些模型可以链接到同一个表,所以我只需要在模型中添加一个$useTable = 'stuff',就可以添加一个type字段。然而,我不知道如何创建一个"父"模型,因为每个模型都扩展了AppModel。

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

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

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

但我敢打赌,还有一种更简单、更干净的方法。

谢谢。

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

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

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

这个链接应该让你对从哪里开始有一个很好的想法。

您基本上使用的是可继承性和可扩展性:

可扩展:[删除链接以符合我的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类服务),所以我创建了Offer模型,其中有一个Offer表,看起来像这样:

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模型中创建所有方法,并且只有任何唯一适合子类产品或服务的方法才会存在于这些模型中。

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

将两个模型共享的方法放入您的AppModel:

这个中间类AppModel是空的,如果你还没有创建从蛋糕里取出自己的/文件夹重写AppModel允许您定义的功能应提供给所有型号在您的应用程序中。要做到这一点,你需要创建自己的app_model.php位于/应用程序/文件夹。

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