2

テーブル

 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>

私の見解では何が悪いのですか?誰かが私を助けてくれたら、私は彼にとても感謝します. 前もって感謝します。

4

1 に答える 1

1

コメントはできないようですが、できる限りお答えします。ビューで p_plan について言及しておらず、 $p が作成されていないことを示していないため、実際に何が起こっているのかわかりにくいです。

ワークフロー: - 3 つのテーブルを取得します - それらを product_id => plan_id の配列の配列に並べ替えます - product_id を列番号まで追跡します - その配列をビューに渡します - ビューで配列を行 = 列として出力します

コントローラ:

//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>
于 2013-02-18T16:01:22.883 に答える