代码之家  ›  专栏  ›  技术社区  ›  Linda

Drupal查看在使用关系时返回的重复值

  •  4
  • Linda  · 技术社区  · 15 年前

    我对观点有意见。我有一个视图,并将按名称向它传递一个分类术语。然后我与一个相关节点建立了关系。对于我的输出字段,我将返回相关标题和相关正文。不过,我的结果有重复。我已将distinct改为yes,但相信这是在处理返回的节点,而不是相关的节点。有什么办法可以把复制品去掉吗?

    更新

    下面是当我只得到标题时运行的查询

    SELECT DISTINCT(node.nid) AS nid,
        node_node_data_field_wine_company.title AS node_node_data_field_wine_company_title,
        node_node_data_field_wine_company.nid AS node_node_data_field_wine_company_nid 
    FROM node node  
    LEFT JOIN content_type_wine node_data_field_wine_company ON node.vid = node_data_field_wine_company.vid 
    INNER JOIN node node_node_data_field_wine_company ON node_data_field_wine_company.field_wine_company_nid = node_node_data_field_wine_company.nid  
    LEFT JOIN term_node term_node ON node.vid = term_node.vid INNER JOIN term_data term_data ON term_node.tid = term_data.tid 
    WHERE term_data.name = 'test'
    GROUP BY nid
    

    看起来我应该按node_node_data_field_wine_company_nid分组,或者从中选择不同的值。有什么想法吗?

    更新

    使用普通VIE可能是不可能的。下面是我的设置。

    我有一个分类法叫区域。区域应用于名为wine的自定义内容类型。 葡萄酒内容类型具有指向公司节点类型的节点引用字段。 公司是自定义节点类型。

    我有一个列出我所有地区的视图。单击区域,我会将其作为参数传递给视图(术语名)。我想把这个地区所有的公司都退回去。

    为了得到这个,我需要得到所有的葡萄酒项目,有那个地区。对于所有葡萄酒项目与地区,我需要得到唯一的公司节点参考。我会把这个还给你。

    一个办法是给每家公司一个地区来列入名单。不过,我宁愿它是从葡萄酒类型自动计算出来的。

    有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Henrik Opel    15 年前

    您的分析似乎是正确的,因为distinct适用于“原始”节点,而不是相关节点。因此,您可以尝试“反转”视图构造,从现在的“相关”节点开始,向现在的“原始”节点添加关系,并根据这些节点的条件筛选结果。最后一点是我不确定的,因为我不知道是否可以对通过关系拉入的节点应用术语过滤器,但这可能值得一试。

    如果最终无法通过“标准”视图功能获得所需的结果,则可以从自定义代码中操作视图,但这需要对使用场景有更详细的了解(例如,是否需要使用寻呼机和类似工具)如果看起来你需要走这条路,你可以通过描述你需要达到的目标来强化你的问题。


    编辑: 至于以编程方式操作视图的选项,您可以查看 views module hooks . 对于查询结果的小调整,可以实现 hook_views_pre_render() 并在中操作返回的结果集 $view->result 直接(即,在执行查询之后)。

    然而,对于更大的操作(比如在您的例子中),可以实现 hook_views_query_alter() 并在实际查询用于返回结果集之前对其进行调整。必须注意只改变sort或filter标准,但要保持返回数据的一般结构(例如,它仍然需要包含视图期望的所有字段)。虽然这种方法提供了巨大的灵活性,但需要注意的是,对于应用于视图的稍后更改,它是脆弱的—如果视图定义的更改方式改变了构造的查询,则在 hook_views_query_alter() 可能不再工作,或者导致奇怪的结果。

    视图钩子会为每个视图触发,因此在应用任何更改之前,需要检查是否有正确的视图(最终也会显示)。