如何使用cakephp在视图中按类别列出产品?

时间:2014-04-18 23:58:55

标签: php cakephp categories

我对控制器和视图有困难。

两个表N - 1关系

产品: ID(PK),名称,价格,尺寸,id_Category

(154,衬衫,20,男,333)
(155,帽子,20,L,325)

类别: ID(PK),名称

(333,new)
(325,折扣)

我对视图的看法:

<?php 
foreach($cats as $cat) { 
    foreach($prods as $prod) { 
        /* category info */
        if ($cat['id'] == $prod['id_Category']) {
        /* products info */
        }
     }
     /* a break between categories */
 }
?>

我期待看到的内容:

  • X类
    • PROD
    • PROD


  • Y类
    • PROD
    • PROD

我对控制器没有任何线索,我也不确定该视图。

1 个答案:

答案 0 :(得分:1)

使用包含

Containable是一种允许您将查询结果限制/扩展到您定义的范围的行为。

例如,这将为您提供类别列表:

// Pseudo controller code
$categories = $this->Category->find('all');
array(
    array(
        'Category' => array(...)
    ),
    array(
        'Category' => array(...)
    )
)

这将为您提供包含所有产品的类别列表:

// Pseudo controller code
$categories = $this->Category->find('all', array(
    'contain' => array('Product')
));
$this->set('categories', $categories); // used in the view
array(
    array(
        'Category' => array(...),
        'Product' => array(
            array(...),
        )
    ),
    array(
        'Category' => array(...)
        'Product' => array(
            array(...),
        )
    )
)

通过这种方式,控制器中唯一需要做的就是循环类别,然后循环包含的产品:

// App/View/Categories/index.ctp example
<?php foreach($categories as $row): ?>
    In category: <?= $row['Category']['name'] ?> we have:
    <?php foreach($row['Product'] as $product): ?>
        * <?= $product['name'] ?>
    <?php endforeach; ?>
<?php endforeach; ?>

约定使生活更轻松。

用于定义关系的外键的conventional名称&#34;属于类别&#34;是category_id

如此命名,可以像这样定义产品模型:

<?php
// App/Model/Product.php
class Product extends AppModel {
    public $belongsTo = array('Category');
}

如果您不想更改外键 - 这不是问题,您只需告诉CakePHP要查找的字段名:

<?php
// App/Model/Product.php
class Product extends AppModel {
    public $belongsTo = array(
        'Category' => array(
            'foreignKey' => 'id_Category'
         )
    );
}