0

我希望你能帮助解决我遇到的这个问题。

我有一个名为“events_delegates_bridge”的桥接表,它有 3 个字段,“id”、“event_id”和“delegate_id”。

我也有名为“代表”和“活动”的表格。

我还有一个名为“delegate_status”的表,它有两个字段,“id”和“delegate_status”。

每个代表都有一个附加状态,可以是“临时”、“确认”或“重新参加”。

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”函数来做各种事情,其中​​之一是为每个包含其状态 ID 的委托生成一个“status_id”变量,这样我就可以将它与 HTML 表中的三列之一关联起来,总临时代表及其姓名,确认的代表总数及其姓名,最后是总补考及其姓名。

我正在生成状态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,并且因为第一个是“临时的”,1 每个委托的所有 $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 回答