在我的数据库中,我有一个“周”表和一个“锻炼”表。我想实现以下内容:
我尝试过类似的事情:
function get_weekly_content() {
$user_id = $this->session->userdata('id');
$weeks = $this->db->select('week_no')->where('user_id', $user_id)->get('weeks');
if($weeks->num_rows > 0) {
foreach($weeks->result() as $row) {
$week_no = $row->week_no;
$workouts = $this->db->where('user_id', $user_id)->where('week_no', $week_no)->get('workouts');
if($workouts->num_rows > 0) {
foreach($workouts as $workout) {
$workout_data[] = $workout;
}
}
$weekly_data[] = $workout_data;
}
return $weekly_data;
}
}
但也许我有错误的想法。然后我还需要显示数据。
编辑我的问题是,在视图页面上实现上述和get和array / object循环的最佳方法是什么?由于
答案 0 :(得分:4)
在循环中循环很好,你的方法是合适的。 但是!
一般来说,如果有任何方法可以避免它,则不应在循环内运行mysql查询,因为查询速度很慢,这会降低脚本的性能。否则,这个想法是正确的。尝试在循环之外编写一个查询,将所有相关的用户数据放入一个键控数组中,然后在循环时从数组中提取信息。
您将看到此行的问题:$weekly_data[] = $workout_data;
如果$workouts->num_rows > 0
...如果它是第一个循环,则会因为$workout_data
赢了而发出错误设置,如果它是后续循环,那么在没有结果的任何一周,它将显示前一周的数据。您可以通过在内循环顶部设置/重置$workout_data
来解决此问题:
$workout_data = array();
if($workouts->num_rows > 0) {
foreach($workouts as $workout) {
$workout_data[] = $workout;
}
}
答案 1 :(得分:0)
function get_weekly_content() {
$user_id = $this->session->userdata('id');
$weeks = $this->db->select('week_no')->where('user_id', $user_id)->get('weeks');
$weekly_data = array();
if($weeks->num_rows > 0) {
foreach($weeks->result() as $row) {
$workout_data = array();
$week_no = $row->week_no;
$workouts = $this->db->where('user_id', $user_id)->where('week_no', $week_no)->get('workouts');
if($workouts->num_rows > 0) {
foreach($workouts as $workout) {
$workout_data[] = $workout;
}
}
$weekly_data[$week_no] = $workout_data;
}
}
return $weekly_data;
}
然后访问数据:
$weekly_data = get_weekly_content();
foreach( $weekly_data as $week_no => $workout_data){
// do something with it.
}
话虽如此,我同意@Ben D,你应该考虑一下你的查询并创建一个可以立即返回所有结果的查询。