情况简述:
house
个模板;每个房子都有一个house_rooms
和一个house_occupants
模板;每个house_rooms
模板都有N house_rooms_room
个模板,每个house_occupants
模板都有N house_occupants_occupant
个模板。这代表一个拥有N房和N居住者的实际房屋。现在我想知道是否有办法专门获取,例如所有遵循特定属性模式的house_occupants_occupant
内容(例如:他们的{ {1}}属性值为'female'且其gender
参数为> = 1990/01/01),无需加载每个date_of_birth
,然后在其中找到house
页面孩子们,然后循环遍历该模板的house_occupants
个孩子,并根据他们的性别和出生日期属性过滤出这样的内容。
我已经发现有一个ContentRepository类可以house_occupants_occupant
和::findAll()
,但似乎没有办法过滤特定属性(如模板类型,模板属性,...)。所以我采用了一种迂回的方式来创建我自己的“存储库”,它在数据库的::findByUuids()
表上执行PDO查询,专门扫描phpcr_nodes
属性以查找某个模板名称的出现:< / p>
props
我可以看到$this->pdo->query("SELECT identifier, props FROM phpcr_nodes WHERE props LIKE '%>house_occupants_occupant<%'");
包含表示XML文档的字符串值,该文档以某种方式转换为具有属性 - 值对的整个模板,但是关于标记级别以及某些属性如何与某些值相关,它是模糊的。所以理论上我可以使用特定的XML解析器将其变成人类可读的东西,这样对于我的props
数据我可以得到类似的东西:
house_occupants_occupant
当我有这个时,我可以过滤可读数据以确定我想要保留哪些内容,将node-uuid添加到某个// 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
];
变量,然后使用Sulu {{1}检索实际内容} 方法。这将“仅”需要2个查询和一些PHP数组过滤,这比从某个父级开始循环所有子内容并执行此操作直到您遍历所有父项及其所有子项要好得多。 ..(当然,如果你想要搜索所有$theUuids
个节点,其中至少有一个ContentRepository::findByUuids($theUuids)
节点代表一个不到10岁的孩子,那么开销就会增加,因为您需要额外的查询来“设置”最终查询中使用的过滤器数据。但仍然:比循环所有内容更好... ;-))
所以我的问题有点双重:
house
列中的XML字符串值转换为人类可读的,具有适当的属性值对?答案 0 :(得分:0)
您找到的ContentRepository
已经是我们对网页的一些要求的抽象。您的要求已经非常具体,因此您应该使用SQL-2 query language for PHPCR编写自己的查询。
这使您可以编写符合要求的查询。