0

私が抱えているこの問題について、あなたが助けてくれることを願っています。

'id'、'event_id'、'delegate_id'の3つのフィールドを持つ'events_delegates_bridge'というブリッジテーブルがあります。

「デリゲート」および「イベント」と呼ばれるテーブルもあります。

'delegate_status'というテーブルもあります。このテーブルには'id'と'delegate_status'の2つのフィールドがあります。

各デリゲートには、「暫定」、「確認済み」、または「再開」のいずれかのステータスが関連付けられています。

テーブル

Table : events_delegates_bridge |   Columns : id , event_id , delegate_id
Table : delegates
Table : events
Table : delegate_status | Columns : id , delegate_status (Provisional , Confirmed , Resit)

ここで、「delegates_model」クラスで、それぞれのテーブルの関連する「id」、「delegate_status」「id」、および「delegate_id」に基づいて、「delegates」、「delegate_status」、および「events_delegates_bridge」テーブルを結合しています。

class Delegate_Model extends CI_Model {

    public function get_delegates() {

        $this->db->select( '*' );
        $this->db->from( 'delegates' );
        $this->db->from( 'delegate_status' );
        $this->db->join( 'events_delegates_bridge', 'events_delegates_bridge.delegate_id = delegates.id AND delegate_status.id = delegates.delegate_status_id', 'inner' );
        $query = $this->db->get();
        return $query->result();

    }

}

次に、「delegates_helper」関数セットを使用してさまざまなことを行います。そのうちの1つは、ステータスIDを含む各デリゲートに対して「status_id」変数を生成することです。これにより、HTMLテーブルの3つの列の1つに関連付けることができます。代表者とその名前、確認された代表者とその名前の合計、そして最後にresitsとその名前の合計。

私は次のようにステータスIDを生成しています:

function get_status_id( $delegates ) {

    foreach ( $delegates as $delegate ) {

        switch( $delegate->delegate_status ) {

            case 'Provisional':
                $status = 'Provisional';
                $status_id = 1;
            break;

            case 'Confirmed':
                $status = 'Confirmed';
                $status_id = 2;
            break;

            case 'Resit':
                $status = 'Resit';
                $status_id = 3;
            break;

            default:
                $status = 'Confirmed';
                $status_id = 2;
            break;

        }

    }

    return $status_id;

}

現時点では、各$ delegate-> delegate_statusには、私が考えるすべてのデリゲートのすべてのレコードがあります。これにより、この関数は常に「暫定」1として表示されます。

私はこの問題に正しく取り組んでいないことを認識しており、必要なことを行う方法についてのガイダンスをいただければ幸いです。みんなありがとう。

注:編集

さて、私が求めている出力は、特定のイベントのすべてのデリゲートを取得し、それらのデリゲートをHTMLの3つの列に分けて、暫定デリゲート、確認済みデリゲート、およびそれらのデリゲートを表示することです。

テーブル

Table : events_delegates_bridge |   Columns : id , event_id , delegate_id
Table : delegates       | Columns : id, delegate_first_name, delegate_last_name, delegate_status_id (1, 2, 3)
Table : events          | Columns : id, event_name, event_start_date
Table : delegate_status | Columns : id , delegate_status (Provisional , Confirmed , Resit)

次の関数を使用して、イベントテーブルのHTMLを生成しています。次に、この情報(変数)をビューで使用して、ブートストラップポップオーバーにデータを入力します。

function delegate_status_total( $delegates, $event ) {

    $status_id = get_status_id( $delegates );

    $current_event_id = $event->id;

    foreach ( $delegates as $delegate ) {

        if( $delegate->event_id == $current_event_id ) {

            if( $delegate->delegate_status_id == $status_id ) {

                $delegate_status_ids[] = $delegate->delegate_status_id;

                $delegate_total = count( $delegate_status_ids );

            }

        }

    }

    return $delegate_total;

}

function delegate_info( $delegates, $event ) {

    $delegate_total = delegate_status_total( $delegates, $event );

    $status_id = get_status_id( $delegates );

    $current_event_id = $event->id;

    $delegate_info = "There are currently a total of $delegate_total Provisional delegates booked on this event.<br /><br />";

    $delegate_info .= '<ul>';

        foreach ( $delegates as $delegate ) {

                if( $delegate->event_id == $current_event_id ) {

                    if( $delegate->delegate_status_id == $status_id ) {

                        $delegate_info .= '<li>';

                            $delegate_info .= $delegate->delegate_first_name . ' ' . $delegate->delegate_last_name;

                        $delegate_info .= '</li>';

                    }

                }

        }
    $delegate_info .= '</ul>';

    return $delegate_info;

}

編集

したがって、$delegatesオブジェクトでforeachループを実行してから$status_idを設定すると、最初のデリゲートの最初のIDのみが設定されます。次のようにforeachループ内で$delegate->delegate_status_idをvar_dump()すると、次のようになります。

foreach ( $delegates as $delegate ) {

    if( $delegate->event_id == $current_event_id ) {

        prettyDump( $delegate->delegate_status_id );

    }

}

期待どおりに、各$delegateアイテム内のすべてのdelegate_status_idを出力します。

string(1) "1"
string(1) "2"
string(1) "3"
string(1) "1"

したがって、各$ delegateには他のすべてのデリゲートのdelegate_status_idsが含まれ、最初のデリゲートは'Provisional'であるため、各デリゲートのすべての$status_id変数がそれに設定されます。

特定のデリゲートステータスIDのみを取得する方法が必要ですか?

4

1 に答える 1

1

ループなしで単一のクエリで実行できたはずです。ここに例があります

SELECT 
    *
FROM events_delegates_bridge AS edb
  LEFT JOIN events AS e
    ON e.id = edb.event_id
  LEFT JOIN delegates AS d
    ON d.id = edb.delegate_id
  LEFT JOIN delegate_status AS ds
    ON ds.id = d.delegate_status_id

デモ

出力

id  event_id    delegate_id id  event_name  event_start_date    id  delegate_first_name delegate_last_name  delegate_status_id  id  delegate_status
----------------------------------------------------------------------------------------------------------------------------------------------------
1   1           1           1   A           2013-03-31          1   Ralf                Rudolph             1                   1   Provisional
2   2           2           2   B           2013-03-31          2   Clark               Filsh               2                   2   Confirmed
3   3           3           3   C           2013-03-31          3   Neil                Johnson             3                   3   Resit

特定の列のみが必要な場合は、クエリで * の代わりに tablename.column を使用します

于 2013-03-02T07:07:47.227 に答える