2013-10-24 56 views
1

大家好,我正在使用codeigniter构建项目管理系统。数据库多表查询和显示结果

我在我的模型中有一个函数来显示一个项目和与之相关的任务。 $ projectId = 1仅用于测试目的。

function getAllProjects($projectId = 1) 
{ 

    $this->db->select('*');  
    $this->db->from('projects'); 
    $this->db->where('projects.projectId', $projectId); 
    $this->db->join('projectTasks', 'projects.projectId = projectTasks.projectId'); 
    $this->db->join('tasks', 'projectTasks.taskId = tasks.taskId'); 
    $projects = $this->db->get(); 
    return $projects; 
} 

然后在我看来,我把它显示结果

<?php if($projects->num_rows() > 0): ?> 
    <table width="100%"> 
    <?php foreach($projects->result() as $p): ?> 
     <tr> 

     <td><?php echo $p->projectId; ?></td> 
     <td><?php echo $p->projectName; ?></td> 
     <?php foreach($projects->result() as $g): ?> 
      <td><?php echo $g->taskName; ?></td> 
      <td><?php echo $g->taskHours; ?></td> 
      <td><?php echo $g->taskCost; ?></td> 
     <?php endforeach; ?> 


     </td> 
     </tr> 
    <?php endforeach; ?> 
    </table> 
<?php else: ?> 
    <p>No projects at this time.</p> 
<?php endif; ?> 

它返回这个

ID - Project Name - Task Name - Task Hours - Task Cost (**to show you what field is what**) 
    1 The Range 702 Contact Form  10   100   Custom Logo Desgin 10 100 Custom Login From 5 75 
    1 The Range 702 Contact Form  10   100   Custom Logo Desgin 10 100 Custom Login From 5 75 
    1 The Range 702 Contact Form  10   100   Custom Logo Desgin 10 100 Custom Login From 5 75 

可有人请告诉我如何使它所以它只显示项目信息一次,然后是与项目关联的每个任务。现在,对于与项目相关的每项任务,都会列出项目及其所有任务。

----------------------- 
|  projects  | 
----------------------- 
| projectId   | (Primary) 
| projectName  | 
| projectHours  | 
| projectDeadline | 
| projectStartDate | 
| projectTasks  | 
| projectUsers  | 
| projectNotes  | 
|      | 
----------------------- 

----------------------- 
|  projectTasks | 
----------------------- 
| projectTasksId  | (Primary) 
| projectId   | (FK project->projectId) 
| taskId    | (FK tasks->taskId) 
|      | 
----------------------- 

-------------------- 
|  tasks  | 
-------------------- 
| taskId   | (Primary) 
| taskName  | 
| taskHours  | 
| taskCost  | 
|     | 
-------------------- 

回答

0

虽然我认为Jorge Campos解决方案很近,但它不会阻止任务被多次列出。

<?php $ProjectId = ''; ?> 
     <?php if($projects->num_rows() > 0): ?> 
     <table width="100%"> 
      <?php foreach($projects->result() as $p): ?> 
      <tr> 
       <?php if ($ProjectId != $p->projectId) { ?> 
       <td><?php echo $p->projectId; ?></td> 
       <td><?php echo $p->projectName; ?></td> 

       <?php foreach($projects->result() as $g): ?> 
        <td><?php echo $g->taskName; ?></td> 
        <td><?php echo $g->taskHours; ?></td> 
        <td><?php echo $g->taskCost; ?></td> 
       <?php endforeach; ?> 

      <?php } ?> 
     <?php $ProjectId = $p->projectId; ?> 

      </tr> 
      <?php endforeach; ?> 
     </table> 
     <?php else: ?> 
     <p>No projects at this time.</p> 
     <?php endif; ?> 

该解决方案将使信息仅显示一次projectId。

+0

我把这段代码放到我的视图中,它完美地工作。非常感谢你帮助我。 – Hayden

+0

不客气,很高兴我可以帮助。 –

0

创建一个变量来存储项目ID为每一次迭代,那么你有实际的项目ID进行比较,如果是不同你展示项目信息。像这样的东西。

<?php 
$beforeProject = ''; 
foreach($projects->result() as $p): 
?> 
    <td><?php if ($beforeProject != $p->projectId) { echo $p->projectId; } ?></td> 

    //rest of code 

    <?php $beforeProject = $p->projectId; ?> 
<?php endforeach; ?>