1

情况的简短描述:

  • 我们正在运行一个分叉版本的 Sulu 1.5.2、PHP 7.1、Windows 服务器环境、与 PostgreSQL 的数据库连接
  • 我们有一个网站结构/树,我们house在顶层有模板;每个房子都有一个house_rooms和一个house_occupants模板;每个house_rooms模板有 Nhouse_rooms_room个模板,每个house_occupants模板有 N个house_occupants_occupant模板。这表示具有 N 个房间和 N 个居住者的实际房屋。

现在我想知道是否有一种方法可以专门获取,例如,遵循某种属性模式的所有house_occupants_occupant内容(例如:它们的gender属性具有值“女性”并且它们的date_of_birth参数是> = 1990/01/ 01),无需加载每个house,然后在孩子中找到它的house_occupants页面,然后遍历该模板的house_occupants_occupant孩子并根据他们的性别和出生日期属性过滤由此产生的内容。

我已经发现有一个ContentRepository类可以::findAll()::findByUuids(),但似乎没有办法过滤特定属性(如模板类型、模板属性……)。所以我采取了一种迂回的方式来创建我自己的“存储库”,它直接phpcr_nodes对数据库中的表进行 PDO 查询,专门扫描props属性以查找某个模板名称的出现:

$this->pdo->query("SELECT identifier, props FROM phpcr_nodes WHERE props LIKE '%>house_occupants_occupant<%'");

我可以看到它props包含一个表示 XML 文档的字符串值,该文档以某种方式转换为带有属性值对的整个模板,但是它在标记级别以及某些属性与某些值的关系方面是模糊的。所以理论上我可以使用一个特定的 XML 解析器把它变成人类可读的东西,这样对于我的house_occupants_occupant数据我可以得到类似的东西:

// what I would get after putting the props through a certain XML parser:
$xmlHumanReadableData = [
    '<the_uuid_of_occupant_1>' => [
        ...
        'gender' => 'female',
        'date_of_birth' => '1992-05-18T00:00:00.000+00:00',
        ...
    ],
    ... //etcetera etcetera
];

如果需要,我可以过滤可读数据以确定我想要保留哪些内容,将 node-uuid 添加到某个$theUuids变量,然后使用 Sulu 的ContentRepository::findByUuids($theUuids)方法检索实际内容。这将“仅”需要 2 个查询和一些 PHP 数组过滤,这比从某个父级开始循环遍历所有子级内容并这样做直到遍历所有父级及其所有子级要好得多。 ..(当然,例如,如果您想搜索house至少一个house_occupants_occupant节点代表小于 10 岁的孩子的所有节点,则开销会增加,因为您需要额外的查询来“设置" 最终查询中使用的过滤器数据。但仍然:比循环所有内容要好得多......;

所以我的问题是双重的:

  • 什么是特定于 Sulu 的 XML 解析器,我可以使用它来将此props列中的 XML 字符串值转换为人类可读的内容,并具有适当的属性-值对?
  • 和/或,希望:有没有一种方法可以避免所有这些废话,而只是使用一种较低级别的方法来检索具有特定属性的特定值的特定模板类型内容
4

1 回答 1

0

ContentRepository您发现的已经是我们对页面的一些要求的抽象。您的要求已经非常具体,因此您应该使用 SQL-2( PHPCR 的查询语言)编写自己的查询。

这应该使您能够编写符合您要求的查询。

于 2017-06-20T08:57:06.880 回答