1

我的模型中有几个表以几种不同的方式相互关联,一个用于资金请求的表将同时引用客户和雇主的实体表 - 所以它需要 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) 我应该如何在实体表中标记我的别名?

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

4

1 回答 1

1

所以它需要2个索引

事实上,您的表可能根本没有 mysql 索引(PRIMARY当您使用 xpdo 对象时,可能只有索引来提高速度)并且它会起作用。但是使用索引请求会更快。

当您处理数据库的架构时,您应该分析将存储哪种数据以及您希望以何种方式获取数据。

让我们分析你的计划。

<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对分贝有用。它们有助于提高请求速度和控制数据(例如,UNIQUE索引意味着当前字段(或几个字段)应该具有唯一值/值组合)

我们来谈谈Relations

所以,每个xpdo对象都有内部属性_relatedObjects。所以它是非常强大的东西XPDO。关系允许这样做(这是一个相当简单的例子):

$u = $modx->newObject('modUser');
$p = $modx->newObject('modUserProfile');

$u->fromArray(…);
$p->fromArray(…);

$u->Profile = $p;
$u->save();

当您分配$p->Profilesetter 时,所有工作都在 4 u 处完成,最后我们的配置文件对象位于_relatedObjects. XPDO用它们来保存。这有点复杂,但简而言之,XPDO保存relatedObjects两次以保留密钥,然后保存所需的对象(modUser在我们的例子中)。最后,我们使用的所有字段Relations都将正确设置。

关于关系字段:

  • 别名 - 关系的名称
  • class — xpdo 对象的类
  • local - 本地对象中的主键字段
  • 外 - 相关对象中的辅助键字段
  • 基数——关系的类型
  • owner - 密钥的所有者

关于命名

当您尝试创建名称时,Relations您的双手是空闲的。但无论如何,他们应该很高兴理解这种关系。

我是如何做到的:名称的最佳来源是您的 db 表名。如果我正在为 modx 开发一个包,我也会将它的名称用于表。

表名:

  • modx_package_obj
  • modx_package_secondobj
  • modx_package_obj_secondobj

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

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

  • PackageObj (id,name)
  • PackageSecondobj (id)
  • PackageObjSecondobj (id, obj_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. 它非常简单,易于理解且非常有用。


让我们回到你的例子。您有两个表,并且彼此创建了两次关系。这非常混乱,无法预测。此外,我们在保存对象时可能会遇到麻烦。

我不知道你试图解决的任务和问题,但可以准确地说你做错了。

您可以正确描述您的任务,也许我可以提供帮助。

UPD

据我了解,您有收款人和客户。收款人可能是客户,也可能不是。

在这种情况下FundRequest->PayeeFundRequest->Client关系会很好。

而且PayeeandClient应该是独立的对象,它们可能有关系。

于 2014-12-29T21:55:59.837 回答