在我的模型中,我有几个表,它们以几种不同的方式相互关联,一个基金申请表将同时引用客户和雇主的实体表-所以它需要2个索引,什么是设置XML模型模式的正确方法?
下面是大大缩短的表格!
<object class="FundRequest" table="fund_request" extends="xPDOSimpleObject">
<field key="token" dbtype="varchar" precision="50" phptype="string" null="true" />
<field key="unixtime" dbtype="varchar" precision="50" phptype="string" null="true" />
<field ... a bunch of fields not related to the question... />
<field key="payee_uid" dbtype="int" precision="8" phptype="integer" null="true" />
<field key="client_uid" dbtype="int" precision="8" phptype="integer" null="false" />
<aggregate alias="Entities" class="Entities" local="payee_uid" foreign="id" cardinality="one" owner="foreign" />
<aggregate alias="Entities" class="Entities" local="client_uid" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="Entities" table="entities" extends="xPDOSimpleObject">
<field key="token" dbtype="varchar" precision="50" phptype="string" null="true" />
<field key="unixtime" dbtype="varchar" precision="50" phptype="string" null="true" />
<field ... a bunch of fields not related to the question... />
<aggregate alias="FundRequest" class="FundRequest" foreign="payee_uid" local="id" cardinality="one" owner="local" />
<aggregate alias="FundRequest" class="FundRequest" foreign="client_uid" local="id" cardinality="one" owner="local" />
</object>我想我应该在FundRequest表中将我的聚合别名命名为:
<aggregate alias="PayeeEntity" class="Entities" local="payee_uid" foreign="id" cardinality="one" owner="foreign" />
<aggregate alias="ClientEntity" class="Entities" local="client_uid" foreign="id" cardinality="one" owner="foreign" />所以我可以把它们称为
$object->FundRequest->PayeeEntity->get('whatever');在我的代码中。
A)这样做正确吗?
B)我应该如何在Entities表中标记我的别名?
C)我认为别名类型是正确的,如果删除了另一个表中的任何一个记录,都不会被删除。
发布于 2014-12-30 05:56:00
,因此它需要2个索引
事实上,您的表可能根本没有mysql索引(当您使用xpdo对象时,可能只有PRIMARY索引来提高速度),它将会工作。但使用索引时,请求的速度会更快。
当你在你的数据库架构上工作时,你应该分析什么类型的数据将被存储,以及你想要以什么方式获取数据。
让我们来分析一下你的计划。
`<aggregate alias="Entities" class="Entities" local="payee_uid" foreign="id" cardinality="one" owner="foreign" /> <aggregate alias="Entities" class="Entities" local="client_uid" foreign="id" cardinality="one" owner="foreign" />`
这非常奇怪,我想这是错误的。此外,我开始认为您在索引和聚合/复合关系(稍后我将它们称为Relations)中搞混了。它们是不一样的。
Relations允许您在XPDO对象之间建立关系。XPDO使用这种机制来保存和获取related objects。
Indexes对db很有用。它们有助于提高请求速度和控制数据(例如,UNIQUE索引意味着当前字段(或多个字段)应具有唯一的值/值的组合)
让我们来谈谈Relations吧。
因此,每个xpdo对象都有内部属性_relatedObjects。所以它在XPDO中是一个非常强大的东西。而关系允许这样做(这是一个相当简单的例子):
$u = $modx->newObject('modUser');
$p = $modx->newObject('modUserProfile');
$u->fromArray(…);
$p->fromArray(…);
$u->Profile = $p;
$u->save();当你将$p赋值给->Profile时,setter做的所有工作都是4 u,最后我们在_relatedObjects得到了profile对象。XPDO使用它们来保存。这有点复杂,但简而言之,XPDO保存relatedObjects两次以保存关键字,并最终保存所需的对象(在本例中为modUser)。最后,我们用于Relations的所有字段都将被正确设置。
关于关系字段:
xpdo别名- relation
的所有者
关于命名
当您尝试为Relations创建名称时,您的手是空闲的。但不管怎样,他们应该很好地理解这种关系。
方法: name的最佳来源是您的db表名。如果我正在为modx开发一个包,我也会使用它的名称来表示表。
表名:
现在我们想要获得modx的map(我不使用方案,因为modx不需要它们)。
CMPGenerator帮助我创建地图。现在我们有了对象:
(id,obj_id,sobj_id)(id,(id,obj_id,))
(id,(id,sobj_id,))
因为我的测试对象应该通过PackageObjSecondobj有关系,我需要关系。
$xpdo_meta_map['PackageObj']= array ( … 'composites' => array ( 'ObjSecondobj' => array ( 'class' => 'PackageObjSecondobj', 'local' => 'id', 'foreign' => 'obj_id', 'owner' => 'local', 'cardinality' => 'many', ), ), ); $xpdo_meta_map['PackageSecondobj']= array ( … 'composites' => array ( 'ObjSecondobj' => array ( 'class' => 'PackageObjSecondobj', 'local' => 'id', 'foreign' => 'sobj_id', 'owner' => 'local', 'cardinality' => 'many', ), ), ); $xpdo_meta_map['PackageObjSecondobj']= array ( … 'aggregates' => array ( 'Obj' => array ( 'class' => 'PackageObj', 'local' => 'obj_id', 'foreign' => 'id', 'owner' => 'foreign', 'cardinality' => 'one', ), 'Secondobj' => array ( 'class' => 'PackageSecondobj', 'local' => 'sobj_id', 'foreign' => 'id', 'owner' => 'foreign', 'cardinality' => 'one', ), ), );
因此,如您所见,xpdo对象的包名+ obj名,Relations的obj名。它非常简单,容易理解,而且非常有用。
让我们回到您的示例。您有两个表,并且彼此创建了两次关系。这是非常混乱的,并且不会在可预测的情况下工作。另外,我们在保存对象时可能会遇到麻烦。
我不知道你的任务和问题,你试图解决,但可以确切地说,你做错了。
你可以恰当地描述你的任务,也许我能帮上忙。
更新
据我所知,你有收款人和客户。收款人可能是客户,也可能不是。
在这种情况下,FundRequest->Payee和FundRequest->Client之间的关系会很好。
另外,Payee和Client应该是独立的对象,并且它们可以有关系。
https://stackoverflow.com/questions/27680987
复制相似问题