首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Modx/xPDO模型中正确定义索引别名?

如何在Modx/xPDO模型中正确定义索引别名?
EN

Stack Overflow用户
提问于 2014-12-29 05:57:33
回答 1查看 370关注 0票数 1

在我的模型中,我有几个表,它们以几种不同的方式相互关联,一个基金申请表将同时引用客户和雇主的实体表-所以它需要2个索引,什么是设置XML模型模式的正确方法?

下面是大大缩短的表格!

代码语言:javascript
复制
<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表中将我的聚合别名命名为:

代码语言:javascript
复制
<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" />

所以我可以把它们称为

代码语言:javascript
复制
$object->FundRequest->PayeeEntity->get('whatever');

在我的代码中。

A)这样做正确吗?

B)我应该如何在Entities表中标记我的别名?

C)我认为别名类型是正确的,如果删除了另一个表中的任何一个记录,都不会被删除。

EN

回答 1

Stack Overflow用户

发布于 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中是一个非常强大的东西。而关系允许这样做(这是一个相当简单的例子):

代码语言:javascript
复制
$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

  • class -xpdo对象的类名称本地-本地object

  • foreign中的主键字段-相关object

  • cardinality中的辅助键字段- relation

  • owner的类型-

的所有者

关于命名

当您尝试为Relations创建名称时,您的手是空闲的。但不管怎样,他们应该很好地理解这种关系。

方法: name的最佳来源是您的db表名。如果我正在为modx开发一个包,我也会使用它的名称来表示表。

表名:

  • modx_package_obj
  • modx_package_secondobj
  • modx_package_obj_secondobj

现在我们想要获得modx的map(我不使用方案,因为modx不需要它们)。

CMPGenerator帮助我创建地图。现在我们有了对象:

  • PackageObj (id,
  • (id,obj_id,sobj_id)

(id,obj_id,sobj_id)(id,(id,obj_id,))

  • PackageObj(id,obj_id,sobj_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->PayeeFundRequest->Client之间的关系会很好。

另外,PayeeClient应该是独立的对象,并且它们可以有关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27680987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档