CakePHP альтернатива наследования таблиц классов? - PullRequest
3 голосов
/ 29 апреля 2011

Я хочу создать модель Наследование таблиц классов в CakePHP.

Я хотел бы, чтобы модель называлась как-то вроде ProductBase, а таблица product_bases содержала бы всю базовую информацию, которую должен иметь каждый продукт, например, upc, цену и т. Д.

Затем предложите конкретным моделям продуктов расширить это. Например, ProductRing с таблицей product_rings для хранения определенной информации о кольце, такой как ring_size, center_stone и т. Д.

Тогда, если я получу данные непосредственно из модели ProductBase, она будет тянуть все типы:

// pull all product types
$this->ProductBase->find('all'); 

Или найти только определенные типы:

// pull only Rings or descendants of the Ring type.
$this->ProductRing->find('all'); 

Возможно ли что-нибудь подобное в CakePHP? Если нет, то что мне делать вместо этого?

Как правильно Торт делать что-то подобное?

Ответы [ 2 ]

1 голос
/ 10 августа 2015

Я работал с CakePHP в течение двух лет и не нашел удовлетворительного решения для этого, поэтому однажды я написал решение для него. Я создал новый вид ORM, который работает как плагин поверх CakePHP 2.x. Я назвал это "кремом".

Он работает аналогично объектам CakePHP 3.0, но дополнительно поддерживает наследование нескольких таблиц. Он также поддерживает очень удобный просмотр структуры данных (ленивая загрузка) и очень прост в настройке. На мой взгляд, это мощнее, чем CakePHP 3.0 предлагает прямо сейчас. Просмотр структуры данных работает следующим образом:

$entity = new Entity('SomeModel', $somePrimaryKeyValue);
$foo = $entity->RelatedModel()->YetAnotherRelatedModel()->someProperty(); 

Однако важно отметить, что в Cream каждый объект-сущность представляет собой совокупность серии моделей и значений первичного ключа, которые объединены вместе. По крайней мере, в случае использования модели наследования. Такое соединение выглядит так:

[<'SomeConcreteModel', primaryKeyValueA>, <'IntermediaryModel', primaryKeyValueB>, <'BaseModel', primaryKeyValueC>]

Важно отметить, что вы можете подобрать эту сущность с помощью любой из указанных комбинаций модель / primaryKeyValue. Все они относятся к одной и той же сущности.

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

Вы устанавливаете цепочку наследования / расширения, просто записывая в свой класс модели:

public $extends = 'YourBaseModel';

Кроме того, вам также необходимо установить обычные отношения CakePHP между моделями (hasOne или serveTo). Он работает так же, как в обычном ООП, с цепочкой моделей, которые наследуются от их баз. Если вы просто используете vanilla CakePHP, вы просто заметите, что эти модели связаны, но когда вы начнете использовать интерфейс Cream, все сущности объединят пары model / primaryKeyValue в один объект.

В моем репозитории github есть файл powerpoint, который объясняет большинство основных функций.

https://github.com/erobwen/Cream

Возможно, мне стоит раскошелиться на проект CakePHP и сделать запрос на извлечение, но пока это отдельный репозиторий. Пожалуйста, не стесняйтесь комментировать или участвовать в разработке "Cream".

Кроме того, для тех, кто предполагает, что лучше всего «работать с потоком CakePHP, как предполагалось», я бы сказал следующее. Общие оценки показывают, что программы на C в 2,5 раза больше, чем аналог C ++. Учитывая, что единственная особенность, которая разделяет эти языки, - это ООП с наследованием и т. Д., Мы можем сделать вывод, что отсутствие надлежащего ООП с наследованием и т. Д. Требует от программиста дополнительной работы с кодом повторения на 150% и т. Д. Механизм наследования в CakePHP очень нужен. Крем является попыткой этого.

1 голос
/ 29 апреля 2011

Вы имеете в виду ARC-отношение (или, по крайней мере, его вариант). Торт не справляется с этими типами отношений на лету. Это означает, что вам придется реализовать свою собственную логику, чтобы справиться с этим.

Другой вариант - классифицировать продукты. Если продукт может вписываться в несколько категорий, то вам понадобятся категории HABTM для каждого продукта. В противном случае вы можете использовать столбец категории. Я подозреваю, что это будет HABTM, который вы ищете.

  • ПРОДУКТЫ: Стол, содержащий продукты.
  • КАТЕГОРИИ: Список категорий любой данный продукт может принадлежать.
  • CATEGORIES_PRODUCTS: Связь между каждый продукт и их различные категории.
  • ТИП: Это флаг, который будет определить тип продукта (т.е. кольцо, туфли, брюки и т. д.)

Тогда, когда вы хотите ВСЕ продукты, вы запрашиваете таблицу продуктов. Когда вы хотите кусок продуктов (то есть кольца), вы выбираете все продукты, которые принадлежат категории RING.

Теперь нам нужно обратиться к информации о товаре. Например, не вся информация будет применяться к каждому продукту. Есть несколько способов сделать это.

  1. Вы можете создать несколько таблиц для держать информацию о продукте. когда вы тянете продукт данного типа, вы тянете свою сопутствующую информацию со стола.
  2. Хранить информацию в тексте поле как сериализованные данные. Все информация может быть определена в настройки вар, а затем вы можете использовать сериализованные данные для сопоставления с информация.

Надеюсь, это поможет. Удачного кодирования!

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