Две модели с общими методами и одной таблицей?[CakePHP] - PullRequest
0 голосов
/ 03 июня 2011

В настоящее время у меня есть две модели: продукт и сервис. Оба имеют одинаковую структуру таблицы и одинаковые методы. Однако, когда я обновлю один метод, мне придется сделать то же самое с другой моделью. И это становится грязным, не говоря уже о том, что я вызываю избыточность, и это не лучшая доступная практика.

Я знаю, что модели могут быть связаны с одной и той же таблицей, поэтому мне просто нужно добавить $useTable = 'stuff' в модель, и я могу добавить поле type. Однако я не могу понять, как создать «родительскую» модель, поскольку каждая модель расширяет AppModel.

Если честно, я почти ничего не знаю об ООП, поэтому я мог упустить что-то очень очевидное и простое.

То, что я сделал бы, не зная, как расширить двух детей (Продукт и Услуга) до родителя (Материал), было бы примерно так:

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

Но держу пари, что есть гораздо более простой и понятный подход.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 03 июня 2011

Используйте поведение.Как указано в кулинарной книге:

Поведение модели - это способ организации некоторых функций, определенных в моделях CakePHP.Они позволяют нам отделить логику, которая не может быть напрямую связана с моделью, но должна быть там.Предоставляя простой, но эффективный способ расширения моделей, поведение позволяет нам присоединять функциональность к моделям путем определения простой переменной класса.Вот как поведение позволяет моделям избавиться от всего лишнего веса, который может не входить в бизнес-контракт, который они моделируют, или который также необходим в других моделях и который затем можно экстраполировать.1007 *http://book.cakephp.org/view/1071/Behaviors

Ссылка должна дать вам довольно хорошее представление о том, с чего начать.

1 голос
/ 21 июня 2011

Поместите методы, которые обе модели совместно используют, в AppModel :

Этот промежуточный класс, AppModel, является пусто, и если вы не создали свой Собственный взят изнутри / торт / папка. Переопределение AppModel позволяет вам определить функциональность, которая должны быть доступны для всех моделей в вашем приложении. Для этого вы нужно создать свой собственный app_model.php файл, который находится в корне / app / folder.

Ваши модели продуктов и услуг расширяют AppModel. Это означает, что для них доступны все методы из AppModel.

1 голос
/ 20 июня 2011

Вы в основном используете наследование и расширяемость:

расширяемо: [ссылка удалена, чтобы соответствовать моему статусу новичка.Это в файле ниже от 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');

(Сервис практически идентичен).

Затем вы создаете всеваших методов в модели предложения, и в этих моделях будет существовать только то, что уникально подходит для продуктов или услуг подклассов.

Надеюсь, это поможет, если вы еще не нашли решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...