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

@Penzizzleここでの秘密は、基本的に、興味のある3つのカテゴリをそれぞれ独自の列で調べる必要があることだと思います。

以下は、この手法を示す簡単なバージョンのクエリです。

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 に答える
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" を使用して、標準の Channel Entries タグをプラグイン タグでラップします。

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

これの優れた点は、標準の Channel Entries タグがチャネル、ステータス、有効期限などのすべてのチェックを行いますが、そのすべてに一致するエントリと、資格のある entry_ids の指定されたリストのみを返すことです。

于 2012-06-22T14:55:44.140 に答える
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 に答える