0

SQL クエリに必要なすべてのデータを取得しようとして、大きな問題が発生しています。私はまだクエリに慣れていないので、これをできるだけ詳しく説明しようと思います。

Wordpress プラグイン NextGen Gallery でクロス クエリを実行しようとしています。基本的に と の 2 つのテーブルがnggalbumありnggalleryます。私がやろうとしているのは、すべてのアルバムとギャラリーのネストされたリストを作成することです。

のデータにnggalbumは、列idnameslugpreviewpicalbumdescsortorderおよびが含まれていますpageid。私が興味を持っている唯一の値は、、、、idおよびです。の値は、このエントリと他のすべてのアルバムおよびギャラリー エントリの関係データを持つシリアル化されたデータです。例:これは基本的に、現在のクエリ アイテムに 2 つのサブアルバム ("a" で始まる対応する ID) があることを意味します:と. ギャラリーがある場合、番号には接頭辞がなく、です(すぐに説明します)。nameslugsortordersortordera:2:{i:0;s:2:"a2";i:1;s:2:"a6";}a2a6angggallery gid

nggalbumこれを使用して、テーブルからすべてのデータを取得します。

    $albums = $wpdb->get_results("SELECT * FROM $wpdb->nggalbum" , OBJECT_K );

    foreach ($albums as $key => $value) {
        $albums[$key]->id = 'a' . $key;
        $albums[$key]->galleries = empty ($albums[$key]->sortorder) ? array() : (array) unserialize($albums[$key]->sortorder)  ;
        $albums[$key]->name = stripslashes( $albums[$key]->name ); 
        $albums[$key]->albumdesc = stripslashes( $albums[$key]->albumdesc );
    }

サンプルデータ:

Array
(
[1] => stdClass Object
    (
        [id] => a1
        [name] => Image Gallery
        [slug] => image-gallery
        [previewpic] => 0
        [albumdesc] => 
        [sortorder] => a:2:{i:0;s:2:"a2";i:1;s:2:"a6";}
        [pageid] => 0
        [galleries] => Array
            (
                [0] => a2
                [1] => a6
            )

    )

[2] => stdClass Object
    (
        [id] => a2
        [name] => ALBUM 1 - High res
        [slug] => album-1-high-res
        [previewpic] => 0
        [albumdesc] => 
        [sortorder] => a:2:{i:0;s:1:"2";i:1;s:1:"3";}
        [pageid] => 0
        [galleries] => Array
            (
                [0] => 2
                [1] => 3
            )

    )

aこれらの ID はアルバムなので、すべての ID にプレフィックスを追加します。これは後で役立つと考えました。自分が何をしているのかわからないので、そうではないかもしれません。

nggallerygidnameslugpathtitlegaldescpageidpreviewpicおよびが含まれますauthor。関連する列はgidnameslugpath、およびのみtitleです。

nggalleryこれを使用して、テーブルからすべてのデータを取得します。

$galleries = $wpdb->get_results( "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->nggallery", OBJECT_K );

foreach ($galleries as $key => $value) {
    $galleriesID[] = $key;
    $galleries[$key]->counter = 0;
    $galleries[$key]->title = stripslashes($galleries[$key]->title);
    $galleries[$key]->galdesc  = stripslashes($galleries[$key]->galdesc);
    $galleries[$key]->abspath = WINABSPATH . $galleries[$key]->path;     
}

サンプルデータ:

Array
(
[2] => stdClass Object
    (
        [gid] => 2
        [name] => new_collection
        [slug] => new-collection
        [path] => wp-content/gallery/new_collection
        [title] => NEW COLLECTION
        [galdesc] => 
        [pageid] => 0
        [previewpic] => 8
        [author] => 1
        [counter] => 0
        [abspath] => /Applications/MAMP/htdocs/igal/wp-content/gallery/new_collection
    )

[3] => stdClass Object
    (
        [gid] => 3
        [name] => cha-collection
        [slug] => cha-collection
        [path] => wp-content/gallery/cha-collection
        [title] => CHA COLLECTION
        [galdesc] => 
        [pageid] => 0
        [previewpic] => 15
        [author] => 1
        [counter] => 0
        [abspath] => /Applications/MAMP/htdocs/igal/wp-content/gallery/cha-collection
    )

今、これは私が立ち往生するところです。galleries各アルバムの配列を解析し、対応するアルバムやギャラリーに関連付けるコードを書きたいと思っていますnggallery

最終的には、次のようなアルバム/ギャラリーのネストされたリストを実現したいと考えています。

(a1) [link] Title
    (a2) [link] Title
        1 [link] Title
        2 [link] Title
        3 [link] Title
    (a3) [link] Title
        1 [link] Title

    [...]   

これについてどうやって始めればいいのか、私には完全にはわかりません。いくつかのステートメントでいくつかのことをループしようforeachとしましたが、ほとんど失敗しました。これをGoogleで検索しますが、この手法が何と呼ばれているのかわかりません。

このようなことを行う方法を本当に理解したいので、このテクニックに光を当てていただければ幸いです. 同様のチュートリアルまたは基本的な概念へのリンクは、私にとって非常に有益です。誰かが私のためにすべてのコードを実行するとは思っていませんが、正しい方向へのステップは大歓迎です (そして、コードを実行したい場合は、いくつかのステップで、もちろん議論しません;))。

どうもありがとうございました!

トレ

4

1 に答える 1

1

アルバムとギャラリーがどのように相互に関連しているか、ネストされたリストに何が必要かがよくわかりません。しかし、問題はやりすぎている「ソートオーダー」列にあるように見えます。テーブル間の多対多の関係を表現しようとしていると思われます。その場合、その関係を表現する別のテーブルを用意する方がきれいかもしれません。それができたら、ギャラリーに関連する nalbums と ngallery をより簡単に照会できると思います。それは大いに役立ちますか?

編集:

わかりましたので、今は理解していると思います。アルバムの階層を作成しようとしていて、各アルバムが持つすべてのギャラリーを含むアルバムの階層全体を印刷したいと考えています。したがって、既存のデザインを使用して、次のようなことができると思います。

PrintGallery( string galleryID ) 
{
   //1 do a query that selects the gallery using the id (use a where clause)

   //2 print gallery details like the name etc whatever you want to 
}

PrintAlbum ( string albumID )
{
   //1 do a query that selects the Album using the id (use a where clause)
   //2 print Album details (name icon etc) but not the gallery array details.

   if(galleries array length > 0 ) 
     /* in case there are no galleries we don't want a hanging <li> with nothing in it */
     echo "<ul>" /* This will ensure the items are nested properly */
     foreach item currentItemID in galleries array
        echo "<li>"
        if (currentItemID is an Album)
            PrintAlbum(currentItemID) /* recurse */
        else /* assume it's a gallery are in the array */
            PrintGallery(currentItemID) 
     echo "</ul>" /* end this level */

}
于 2012-05-08T02:39:27.403 に答える