gpt4 book ai didi

php - 推进ORM:将具有外键关系的通用模型对象完全递归合并,以进行JSON序列化

转载 作者:行者123 更新时间:2023-11-29 03:13:03 25 4
gpt4 key购买 nike

我是新来推动ORM(和一般的ORMs)的,并试图在这里了解如何正确、干净地解决MySQL数据库中的外键关系。
从3个简单的MySQL表开始:
英雄:
身份证件
名称
描述
技能:
身份证件
名称
等级
英雄技能:
身份证件
英雄身份证
技能id
其中英雄技能具有预期的外键属性,并且与所有推进类一起生成。
在《推进》中,我如何完全“水合”一个“英雄”对象,并以一种通用的方式恰当地引用他们的所有技能?
如何使用特定函数完成此操作的简单示例:

function getAllTheHeroes(){
$query = PropelQuery::from("Hero")
$heroes = $query->find(); //hero model objects
foreach($heroes as $hero){
$heroSkills = $hero->getHeroSkills(); //hero_skill model objects
foreach($heroSkills as $heroSkill){
$skill = $heroSkill->getSkill(); //skill model object.
}
echo $hero->exportTo('JSON'); //export to JSON string (new in Propel 1.6)
}
}

因此,上面的代码获取所有英雄,迭代并获取英雄id的所有英雄技能记录的集合,然后迭代并获取技能id的技能记录。重要的是,它将所有这些解析的关系打包为对英雄对象的引用,因此调用getWHATEVER()“水合物”对象的数据,所有这些使得当每个英雄被导出到JSON时,它有一个这个英雄的所有技能记录的列表,而不仅仅是id。只要编写自定义函数来处理每个对象类型,这就可以正常工作。这里的JSON类似于:
[{
"Id":1,
"Name":"Hero McHeroington",
"Description":"Awesome.",
"HeroSkills":
{
"HeroSkill_0":
{
"Id":1,
"HeroId":1,
"SkillId":2,
"Skill":
{
"Id":2,
"Name":"Interpretive Dance",
"Rank":5
}
},
"HeroSkill_1":
{
"Id":2,
"HeroId":1,
"SkillId":4,
"Skill":
{
"Id":4,
"Name":"Pottery",
"Rank":2
}
},
"HeroSkill_2":
{
"Id":3,
"HeroId":1,
"SkillId":5,
"Skill":
{
"Id":5,
"Name":"Walking",
"Rank":1
}
}
}
},{
"Id":2,
"Name":"Squire McTinyPants",
"Description":"Chipper.",
"HeroSkills":
{
"HeroSkill_0":
{
"Id":4,
"HeroId":2,
"SkillId":2,
"Skill":
{
"Id":2,
"Name":"Interpretive Dance",
"Rank":10
}
},
"HeroSkill_1":
{
"Id":5,
"HeroId":2,
"SkillId":3,
"Skill":
{
"Id":3,
"Name":"Peeping",
"Rank":6
}
},
"HeroSkill_2":
{
"Id":6,
"HeroId":2,
"SkillId":6,
"Skill":
{
"Id":6,
"Name":"Skipping",
"Rank":4
}
}
}
}]

嘘嘘。
我想做的是更普通的事情:
function getModel($byClassName){
$pq = PropelQuery::from($byClassName)
$recs = $pq->find(); // <- collection of records of unknown type
foreach ($recs as $rec){
//Somehow retrieve all of the 'getFOREIGNKEY' Propel generated helper functions and call them all in sequence,
// then iterate down into any of these logical children objects and repeat the process to fully resolve all Foreign Key relationships within this Object
// and all this Objects 'children'
// AND not get stuck in infinite loops due to Many-To-Many relationships from the 'getWHATEVER' calls running in circles.


//Or some other method entirely to accomplish the same thing that i am just not getting...

echo $rec->exportTo('JSON'); //export to JSON string (new in Propel 1.6)
}
}

我正在研究推进文档和源代码,但我还没有完全理解Peer/TableMap/RelationMap/etc模型,我正在接近一个现成的解决方案,但一直在寻找死胡同。
但这似乎不是一个非常独特的概念,我试图使发生在这里,所以我希望有一个推进大师在这里谁可以迅速指出我在这方面是迟钝的。
谢谢!
编辑:(回应wimvds评论)
通用方法的目标是允许我在数据库级别配置关系,然后推动生成PHP类,并将它们用作对象,而不必担心底层数据存储。
使用一种特定的方法,我必须在数据库中定义这些关系,然后编写一个自定义的“水合”函数(如上所列),以便从数据存储中正确地检索对象。这种方法的哲学问题是复制,如果我改变数据库中的关系,然后重新运行propel gen,那么我还必须更新我的水合功能,以反映结构的变化。似乎所有的部分都应该在那里,以便跳过最后一步并删除复制。
例如,在上面的小的特定案例水合函数中,我所做的只是基于我头脑中的英雄技能与英雄和技能相关的知识调用getWHATEVER()帮助函数,当我得到英雄时,我想检查英雄技能并获得相应的技能列表。由于外键的原因,pulple也知道这些关系,而且当使用joinWith()时,它甚至还知道递归(将递归对象引用设置为字符串值'*recursion'),因此pulpe的各个部分都在适当的位置,以便在优雅地解决/忽略递归的同时智能地自动对这些对象进行水合处理,我只是找不到合适的实现这一点的语法。
ie:获取一个对象,解析它的FK关系,对所有“子”对象(FK在相关表中的行)进行水合处理,并排除递归对象。
我想我要寻找的是一种完全抽象数据存储的方法,利用Propel基于database schema.xml定义的类生成能力,因此不必定制编写一组助手函数,如果数据结构发生更改,这些函数可能会发生更改。因此,允许我用对象而不是数据库记录来编码,这难道不是ORM的全部意义吗?
希望能澄清一点,谢谢!

最佳答案

我想您可以尝试使用isCrossRef table属性来简化查询/水合。
见:http://www.propelorm.org/wiki/Documentation/1.5/WhatsNew#Many-to-ManyRelationships

关于php - 推进ORM:将具有外键关系的通用模型对象完全递归合并,以进行JSON序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5188528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com