複数のコンテンツタイプの最後の5つのノード、たとえばtypeA
、typeB
、typeC
、typeD
をクエリしたい。
元々は1つのコンテンツタイプのみでしたが、私は EntityFieldQuery を使用してそれを行いました。
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'typeA')
->propertyCondition('status', 1)
->propertyOrderBy('created', 'DESC')
->range(0, 5);
$result = $query->execute();
しかし、今度は他の3つのコンテンツタイプをリストに含める必要があります。
このクエリを拡張して、他の3つのコンテンツタイプの最後の5つのノードも含める方法はありますか?結果には、4つのコンテンツタイプすべてから5つの最後のノードがあり、全体で20ノードになります。
または、4つの個別のクエリでそれを行う必要がありますか?
EntityFieldQueryの2行目を次のように変更するだけでよいと思います。
->entityCondition('bundle', array('typeA', 'typeB', 'typeC', 'typeD'), 'IN')
ただし、このテストはまだ行っていませんが、この方法で複数のコンテンツタイプをクエリできます。
乾杯
編集:多分これはあなたをもっと助けることができます: https://www.drupal.org/node/2048345
次のコードのようなものを試してください:
$types= array('type1','type2','type3');
foreach ($types as $type) {
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'typeA')
->propertyCondition('status', 1)
->propertyOrderBy('created', 'DESC')
->range(0, 5);
$temp = $query->execute();
if (isset($temp['node'])) {
$result[$type]['nids'] = array_keys($temp['node']);
$result[$type]['nodes'] = node_load_multiple($result[$type]['nids']);
}
}
/// then you can load them by
他の人がUNIONの使用が1つのクエリでそれを行う最も簡単な方法になると示唆しているように、私は思います:
$nids = db_query("(SELECT nid FROM node WHERE type = 'typeA' ORDER BY changed LIMIT 0, 5)
UNION
(SELECT nid FROM node WHERE type = 'typeB' ORDER BY changed LIMIT 0, 5)
UNION
(SELECT nid FROM node WHERE type = 'typeC' ORDER BY changed LIMIT 0, 5)
UNION
(SELECT nid FROM node WHERE type = 'typeD' ORDER BY changed LIMIT 0, 5)")->fetchCol();
$nodes = node_load_multiple($nids);
私は numbered rows を使用してそれを行う方法で遊んでいましたが、最新のノードを取得しないのであきらめましたが、修正することに関心がある場合のSQLは次のとおりです。
SELECT nid, title, type, changed
FROM (
SELECT nid, title, type, changed,
@num := if(@group = type, @num + 1, 1) as row_number,
@group := type as dummy
FROM node
WHERE type IN ('typeA', 'typeB', 'typeC', 'typeD')
ORDER BY type, title
) AS x
WHERE row_number <= 5
ORDER BY type
また、この非常に関連するSO質問 MySQL:特殊タイプの最新のn行を取得する方法 も参照してください)==