繁体   English   中英

具有共享方法和同一张表的两个模型? [蛋糕PHP]

[英]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 的文件中]

可继承: 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 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM