我的模板中有代码:
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
->propertyCondition('type', 'article')
->propertyCondition('status', 1)
->fieldCondition('field_show_on', 'tid', $group['identifier'], '=') // taxonomy identifier
->fieldCondition('field_perks_categories', 'tid', $categories['tid'], '=')
->fieldCondition('field_perks_sub_categories', 'tid', $subcategory['tid'], '=')
->execute();
我有另一个名为“artc_order”的表,其中包含nid,权重到手动订购商品 我想实现这个: http://eureka.ykyuen.info/2012/05/16/drupal-7-order-entityfieldquery-by-random-using-hook_query_tag_alter/ 到我的模板文件,怎么做?
答案 0 :(得分:0)
对您的案例而不是db_select
使用EntityFieldQuery()
可能很有用。您无法将JOIN
直接添加到EntityFieldQuery
,因为它不受支持,可能在Drupal 8中。
您的查询可以使用db_select
重写,如下所示:
$query = db_select('node', 'n')
->fields('n', array('nid'))
->leftJoin('field_data_field_show_on', 'fso', 'fso.entity_id = n.nid') // You can use INNER if you need
->leftJoin('field_data_field_perks_categories', 'fpc', 'fpc.entity_id = n.nid') // Same thing here
->leftJoin('field_data_field_perks_sub_categories', 'fpsc', 'fpsc.entity_id = n.nid') // And here also
->leftJoin('order', 'o', 'o.nid = n.nid') // Join artc_order
->condition('n.type', 'article', 'LIKE')
->condition('fso.field_show_on_tid', $group['identifier'])
->condition('fso.field_perks_categories_tid', $categories['tid'])
->condition('fso.field_perks_sub_categories_tid', $subcategory['tid'])
->condition('n.status', 1)
->orderBy('o.weight')
->execute();
PS:我无法测试这个查询,因为我没有你的数据库,但几乎就是这样。
PS2:在 template.php 文件中使用查询不是一个干净的方法,我知道在某些极端情况下,我们需要这样做,但我认为Drupal有很多钩子,允许我们直接在自定义模块中使用我们需要的内容而不是 template.php (这只是我的观点,我可能是错的)