我希望你能解决我遇到的这个问题。
我有一个名为'events_delegates_bridge'的桥牌表,它有3个字段,'id','event_id'和'delegate_id'。
我也有名为'delegates'和'events'的表。
我还有一个名为'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'加入表'委托','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)
我正在使用followoing函数为events表生成HTML。然后在视图中使用此信息(变量)来填充引导程序popover:
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循环中var_dump()$ delegate-&gt; delegate_status_id,如下所示:
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,并且因为第一个委托是'临时',所以每个委托的所有$ status_id变量都设置为。
必须有一种方法只检索特定的委托状态ID吗?
答案 0 :(得分: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而不是查询中的*