大家好,我是cakephp的新手 现在我面临一个小问题 这是情况
我有一家商店,其中有许多产品与许多产品相关,每个产品都有一个类别 我想通过购买商店来取得所有这些 我不知道该怎么做 尝试使用hasMAny只给我ids
相反有没有办法让商店里面的商品目录每个目录都有产品的数组,其中有一个类别的数组 谢谢
答案 0 :(得分:0)
好的,我现在在电脑上:)。
在ShopModel中:
class ShopModel extends AppModel {
public $hasMany = array(
'Catalog' => array(
// binding params here...
),
);
}
在CatalogModel中:
class CatalogModel extends AppModel {
public $hasMany = array(
'Product' => array(
// binding params...
),
),
}
......这继续......
如果您不想在所有操作中获取过多数据,则应在AppModel中设置:
class AppModel extends Model {
public $recursive = -1;
}
在您使用关联调用find函数的控制器操作中:
$this->Shop->Behaviors->load('Containable');
$big_array = $this->Shop->find('all', array(
'conditions' => array(
//...
),
'contain' => array(
'Catalog' => array(
'Product' => array(
// etc, you get the point :)
),
),
),
));
声明$ belongsTo关联也很好,所以你可以从任何地方访问任何东西,如下所示:
$this->Catalog->Behaviors->load('Containable');
$big_array = $this->Catalog->find('all', array(
'conditions' => array(
//...
),
'contain' => array(
'Product' => array(
// ...
),
'Shop' => array(
// ...
),
),
));
修改强>
我看到你有一个Product->类别关系,我想用$ belongsTo来定义。如果您执行上述查询,您将获得大量重复查询(许多产品中的相同类别)。您可以使用$this->Category->find('list')
,但我经常发现这不合适,因为它只返回一个字段(如果有人知道如何获得更多字段列表类型,我将不胜感激)。为此,我的解决方法是在Category模型中创建一个自定义函数,如下所示:
class Category extends AppModel {
public function getSorted ($options = array()) {
$temp= $this->find('all', $options);
$output = array();
foreach ($temp[$this->alias] as $row) {
$output[$this->alias][$row['id']] = $row;
}
unset($temp);
return $output;
}
}
然后在控制器中我会声明两个数组,没有类别关联的大数组和类别列表一个:
$this->loadModel('Category');
$this->set('categories', $this->Category->getSorted());
这样,我可以在视图中的任何需要的地方按类别ID获取所需的类别。
答案 1 :(得分:-1)
不要使用CakePHP关联他们不善于处理复杂的关系,你以后会遇到问题....而是动态创建所有的连接查询...我给你举一个例子:
在Shop模型中创建一个函数并加入目录和产品,如下所示:
$options = array(
'conditions' => array('Product.id'=>9),
'joins' => array(
array(
'alias' => 'Catalog',
'table' => 'catalogs',
'type' => 'LEFT',
'conditions' => array(
'Catalog.product_id = Product.id',
),
),
array(
'alias' => 'Product',
'table' => 'products',
'type' => 'LEFT',
'conditions' => array(
'Shop.id = Product.shop_id',
),
)
),
'fields' => array('Product.*'),
'group' => array('Product.id')
);
$returnData = $this->find('all',$options);
这将使编码变得更容易,您可以逃避关联!