【问题标题】:OrderBy filters out row with empty field in EntityFieldQueryOrderBy 过滤掉 EntityFieldQuery 中具有空字段的行
【发布时间】:2013-12-12 10:37:09
【问题描述】:

例如,我有一个 EFQ 请求,例如:

$query  ->entityCondition('entity_type', 'node')
        ->entityCondition('bundle', 'contenttype')    
        ->propertyCondition('status', 1)
        ->propertyCondition('language', $language->language, '=')
        ->fieldOrderBy('field_date', 'value', 'DESC')
        ->fieldOrderBy('field_code', 'value', 'DESC')

field_code 可以为空。当我按此字段排序时,它将排除所有获得空值的行。如何避免这种行为并让它们留在结果中?

【问题讨论】:

  • 您可能已经通过搜索 drupal.org 注意到,您的问题是一罐蠕虫......您是否有机会使您的字段不可为空?
  • 绝对不是,真的很糟糕!绝对没有办法绕过这个?
  • 如果我们用 Mysql 来讨论,你应该添加像 field_code IS NULL 这样的订单条件。但是,如果我们谈论 EFQ,这并不容易。也许您可以使用 hook_entity_query_alter 更改 EFQ 并将 queryCallback 更改为您自己的函数。

标签: drupal drupal-7


【解决方案1】:

我最近不得不通过使用 db_select() 并为 isNull 和 isNotNull 传递一个 db_or() 来解决与此类似的问题。我认为 EFQ 不够灵活,无法满足您的需求。类似这样的东西应该可以工作:

$query = db_select('node', 'n')
->fields('n')
->condition('n.type', 'contenttype')
->condition('n.status', 1)
->leftJoin('field_data_field_code', 'c', 'n.nid = c.entity_id')
->fields('c');

$db_or = db_or();
$db_or->isNull('c.field_code_value');
$db_or->isNotNull('c.field_code_value');

$query->condition($db_or);

$query->orderBy('c.field_code_value', 'DESC');

$results = $query->execute()->fetchAllAssoc('nid');

if ($results) {
    $nodes = node_load_multiple(array_keys($results));
    return $nodes;
}

但有一个问题 - 为什么您要尝试在示例中按 2 个不同的字段排序?

【讨论】:

  • 我会尽快尝试的!我试图写一些类似的东西,但不可能在 EFQ 中使用 db_or() 。我必须按日期和代码订购节点,因为我们从一个日期开始有很多节点,所以我们需要订购它
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多