0

我已经为此苦苦挣扎了几天,但我没有从 EE 论坛得到任何回复。本质上我正在尝试这样做(请参阅类别位):

{exp:channel:entries channel="events" category="7&(175|177)"}

但是您不能将 AND/OR 类别请求与开箱即用的本机标签混合使用

我一直在尝试编写一个自定义查询来处理它,但我一直坚持如何处理类别帖子表。

目前我的查询看起来像这样,但类别查询不起作用。

{exp:query sql="SELECT 
             type.cat_id, 
             type.cat_name as cat_name, 
             type.cat_url_title,
             type.group_id,
             t.title as title,
             t.status,
             t.channel_id,
             t.site_id,
             d.field_id_32 as date,
             p.cat_id as cat_id
            FROM 
             exp_categories type JOIN 
             exp_category_posts p ON type.cat_id = p.cat_id JOIN
             exp_channel_titles t ON p.entry_id = t.entry_id JOIN
             exp_channel_data d ON t.entry_id = d.entry_id
            WHERE 
             t.status = 'open' AND
             t.site_id = 1 AND
             type.group_id = 2 AND
             /* problem bit! */
             (p.cat_id = 7 AND ((p.cat_id = 175) OR (p.cat_id = 177))) AND
             t.channel_id = 3
            GROUP BY 
             type.cat_id
            ORDER BY
             type.cat_order
  LIMIT 5"}

如果有人以前做过这样的事情或者可以看到我哪里出错了,我真的很感激指导!

4

4 回答 4

1

这不能在单个查询中完成。我会为此构建一个简单的插件(从pkg.io开始)并执行几个查询,返回 entry_ids 以传递给 Channel Entries 标记。

$cat_7_entries = $final_entries = array();
$cat_7_query = $this->EE->db->query("SELECT entry_id FROM exp_category_posts WHERE cat_id = 7");
if($cat_7_query->num_rows() > 0)
{
    foreach($cat_7_query->result_array() as $row)
    {
        $cat_7_entries[] = $row['entry_id'];
    }
    $cat_7_entries = implode(',', $cat_7_entries);

    $entries_query = $this->EE->db->query("SELECT entry_id FROM exp_category_posts WHERE cat_id IN(175,177) AND entry_id IN(".$cat_7_entries.")");
    if($entries_query->num_rows() > 0)
    {
        foreach($entries_query->result_array() as $row)
        {
            $final_entries[] = $row['entry_id'];
        }
        $vars = array(0 => array('entry_ids' => implode('|', $final_entries)));
        return $this->EE->TMPL->parse_variables($this->EE->TMPL->tagdata, $vars);
    }
}

然后只需使用 parse="inward" 将标准频道条目标签与您的插件标签一起包装。

{exp:my_plugin:my_method parse="inward"}
{exp:channel:entries channel="events" entry_id="{entry_ids}"}
...
{/exp:channel:entries}
{/exp:my_plugin:my_method}

这样做的好处是标准的频道条目标签会为您检查频道、状态、到期日期等,但只会返回与您指定的合格 entry_id 列表匹配的所有条目。

于 2012-06-22T14:55:44.140 回答
1

@Penzizzle 我认为这里的秘诀是您需要在各自的专栏中基本上检查您感兴趣的三个类别。

这是演示此技术的查询的简化版本:

SELECT 
   t.entry_id,
   cat1.cat_id as cat1,
   cat2.cat_id as cat2,
   cat3.cat_id as cat3
FROM
   exp_weblog_titles t
JOIN
   exp_category_posts as cat1 ON cat1.entry_id = t.entry_id
JOIN
   exp_category_posts as cat2 ON cat2.entry_id = t.entry_id
JOIN
   exp_category_posts as cat3 ON cat3.entry_id = t.entry_id
WHERE
   cat1.cat_id = 175 AND (cat2.cat_id = 177 OR cat3.cat_id = 175)

看看这对你有什么作用?

于 2012-06-25T18:47:48.417 回答
1

哇,多好的查询啊!稍微退后一步怎么样?为什么不让你的外循环只是逻辑的一部分,然后在循环内做平衡:

{exp:channel:entries channel="events" category="7"}
  {categories show="175|177"}
    {!-- do stuff --}
  {/categories}
{/exp:channel:entries}

这可能正是您度过一个愉快的星期五所需要的;)

-s。

于 2012-06-22T12:35:21.720 回答
0

试试这个 where 子句:

WHERE 
  t.status = 'open' AND
  t.site_id = 1 AND
  type.group_id = 2 AND
  t.channel_id = 3 AND
  p.cat_id = 7 OR p.cat_id = 175 OR p.cat_id = 177

如果你真的想要这个逻辑:

/* problem bit! */
(p.cat_id = 7 AND ((p.cat_id = 175) OR (p.cat_id = 177))) AND

那么你可能不得不重新组织你的表格和逻辑。

于 2012-06-22T08:07:19.817 回答