如何根据相关ID打印数据?

时间:2013-02-18 13:32:08

标签: php cakephp

 Product        Plan            ProductPlan
 id |name       id |name        id  | product_id | plan_id     
 1    aplha      1   a          1        1          2             
 2    bravo      2   b          2        4          c   
 3    charlie    4   c   
 4    delta

我想针对相关产品打印计划名称,就像那样

查看我想要的内容

 alpha  |  delta   |  
  a          c
  b

但它显示我喜欢,

alpha   |   bravo  |   charlie   |delta 
 a
 b      
 c

这是我的控制器代码

    $p_plan = $this->ProductPlan->find('all',array(
                                    'conditions'=>array(
                                                'ProductPlan.product_id'=>'Product.product_id'
                                                )                       
                                        )
                                    );  
    $this->set('p_plan', $p_plan);  

这是我的观看代码,

 <table>
<thead>
    <tr>
        <?php foreach ($p as $ps){?>
        <th>
                <?php echo __l($ps['Product']['name']);?>

        </th>
        <?php }?>
    </tr>   
</thead>    
    <tbody>
        <?php foreach ($p as $p1){
                    foreach($p1['Plan'] as $plan){
                        debug($plan);
        ?>
        <tr>
            <td>
                <?php echo __l($plan['name']);?>    
            </td>
        </tr>           
        <?php }
                    }?>

        </tbody>

我的观点有什么不妥?如果有人帮助我,我会非常厌烦他。提前谢谢。

1 个答案:

答案 0 :(得分:1)

显然我无法发表评论,但我会尽力回答。由于你没有在你的视图中提到p_plan,并且你没有显示是否创建了$ p,所以很难分辨出实际发生的情况。

工作流程:   - 获得3张桌子   - 将它们分类为product_id =&gt;数组的数组。 plan_id的数据类型   - 跟踪product_ids到列号   - 将该数组传递给视图   - 在视图中将数组打印为row = column

控制器:

//get just the productplan table
$p_plan = $this->ProductPlan->find('all',array(
    'conditions'=>array(
            'ProductPlan.product_id'=>'Product.product_id'
    ),'recursive' => -1
)); 

//get just the products table
$products = $this->Product->find('list',array(
    'fields' => array('id','name')
));

//get just the plans table
$plans = $this->Plan->find('list',array(
    'fields' => array('id','name')
));

//holder is a table to store counting variables
$holder = array(null);
//final_p_plan will be passed to the view.  Array of arrays sorted as product_id => plan_ids
$final_p_plan = array(null);
//p_plan_ids will be passed to the view.  Stores an array of used product id
$p_plan_ids = array(null);
//max_length is keeping track of how long the longest one is.  will be passed to view.  needed for the loop.
$max_length = 0;

//want to end up with an array we can just loop through and print off
foreach($p_plan as $p)
{
    //if it's empty set row 0 as product name, then row 1 as the active plan name.  else set the next row to the next plan name
    if(empty($holder[[$p['product_id']]]))
    {
        $holder[[$p['product_id']]]['i'] = 2;
        $final_p_plan[$p['product_id']][0] = $products[$p['product_id']];
        $final_p_plan[$p['product_id']][1] = $plans[$p['plan_id']];

        array_push($p_plan_ids,$p['product_id']);
    } else {
        $final_p_plan[$p['product_id']][$holder[[$p['product_id']]]['i']] = $plans[$p['plan_id']];
        $holder[[$p['product_id']]]['i'] = $holder[[$p['product_id']]]['i'] + 1;
        if($holder[[$p['product_id']]]['i'] > $max_length)
        {
            $max_length = $holder[[$p['product_id']]]['i'];
        }
    }
}

$this->set('final_p_plan', $final_p_plan);
$this->set('p_plan_ids', $p_plan_ids);
$this->set('max_length', $max_length);

查看:

<table>
    <?php $i = 0; while($i < max_length): ?>
        <?php if($i == 0): ?>
            <thead>
                <tr>
                    <?php foreach($p_plan_ids as $id): ?>
                        <th>
                            <?php echo $final_p_plan[$id][$i]; ?>
                        </th>
                    <?php endforeach; ?>
                </tr>
            </thead>
            <tbody>
        <?php else: ?>
            <tr>
                <?php foreach($p_plan_ids as $id): ?>
                    <th>
                        <?php echo $final_p_plan[$id][$i]; ?>
                    </th>
                <?php endforeach; ?>
            </tr>
        <?php endif; $i++; ?>
    <?php endwhile; ?>
    </tbody>
</table>