草庐IT

mysql - CakePHP 替代类表继承?

coder 2023-10-23 原文

我想创建一个 Class Table Inheritance 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 中有这样的可能吗?如果不是,我应该怎么做?

做这样的事情的正确蛋糕方式是什么?

最佳答案

我用 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 或 belongsTo)。它就像在普通的 OOP 中一样工作,具有从它们的基础继承的模型链。如果您只使用 vanilla CakePHP,您只会注意到这些模型是相关的,但是当您开始使用 Cream 界面时,所有实体都会将模型/primaryKeyValue 对合并到一个对象中。

在我的 github 存储库中,有一个 powerpoint 文件解释了大部分基本功能。

https://github.com/erobwen/Cream

也许我应该 fork CakePHP 项目并发出拉取请求,但现在它是一个单独的存储库。请随时发表评论或参与开发“Cream”。

此外,对于那些建议最好只“按预期使用 CakePHP 流程”的人,我会提出以下观点。常见的估计表明 C 程序比 C++ 程序大 2.5 倍。鉴于将这些语言分开的唯一特征是具有继承等的 OOP,我们可以推断出缺乏具有继承等的适当 OOP 需要程序员对重复代码等进行 150% 的额外工作。因此我认为一个适当的模型CakePHP 中非常需要继承机制。 Cream 是这方面的一次尝试。

关于mysql - CakePHP 替代类表继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5833145/

有关mysql - CakePHP 替代类表继承?的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. ruby-on-rails - Rails 单表继承 : How to override the value written to the type field - 2

    在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型

  5. ruby - 允许主机名包含下划线的 URI.parse 的替代方法 - 2

    我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:

  6. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  7. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  8. ruby-on-rails - 为什么 DataMapper 使用混合与继承? - 2

    所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass

  9. ruby-on-rails - Ruby on Rails 单表继承(STI)和单元测试问题(使用 PostgreSQL) - 2

    我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户...8)错误:test_the_truth(用户测试):ActiveRecord::StatementInvalid:PGError:ERROR:关系“技术人员”不存在:从“技术人员”中删除...从本质上讲,标准框架不承认Technicians和Users表(或PostgreSQL称它们为“关系”)不存在,事实上,应该别名为Accounts。有什么想法吗?我对RoR比较陌生,不知道如何解决这个问题而又不完全删除STI。 最佳答案 原来问题是由于存在:./te

  10. ruby - 为什么 Ruby 模块继承不像类继承那样工作? - 2

    假设我有一个名为Flight的模块,其中包含类方法和实例方法。我可以使用include、extend或两者将其方法放入类中:classBatinclude会将Flight添加到Bat.ancestors,但extend不会。我的问题是,为什么模块与类不同?当我对Mammal进行子类化时,我总是同时获得类和实例方法。然而,当我混入一个模块时,我不能同时获得类和实例方法(除非我使用self.included钩子(Hook)或类似ActiveSupport::Concern的东西)。这种差异背后是否存在语言设计问题? 最佳答案 Modul

随机推荐