我有一个网站,里面有通常的卖家,商品和图片。模型看起来像这样:
class Seller extends AppModel {
$hasMany = array('Item');
...
}
class Item extends AppModel {
$belongsTo = array('Seller')
$hasMany = array('Image');
...
}
class Image extends AppModel {
$belongsTo = array('Item');
...
}
我的问题是,当我检索一个项目列表时,数据会以不同的格式显示,具体取决于我是否获得所有项目的列表(显示给公众) ItemsController,或卖家及其在SellersController中的项目的详细信息。
简要Item->find('all')
检索一个
array( 'Item' => array( <item stuff> ),
'Images' => array of array( <image stuff> ) );
而Seller->find('first', ...)
将项目检索为
array( 'Seller' => array( <seller stuff> ),
'Item' => array of array ( <item stuff>
'Images' => array of array( <image stuff> ) );
在第二种情况下,Images
元素嵌套在Item
部分中。如果数据格式不同,则重新使用View代码会变得更加困难。当图像位不在预期位置时,我的项目afterFind()
将无法正常工作。
问题
在第二种情况下,是否有一种简单的方法可以阻止'Images'
部分嵌套在'Item'
部分内?
我正在使用Cake 2.4
详细信息格式
所有项目:
// in ItemsController.php
debug($this->Item->find('all'));
产生这个:
array(
(int) 0 => array(
'Item' => array(
'id' => '1',
'title' => 'tom item 1',
'seller_id' => '1'
),
'Seller' => array(
'id' => '1',
'name' => 'tom'
),
'Images' => array(
(int) 0 => array(
'id' => '1',
'item_id' => '1',
'path' => 'tom_1_1'
),
(int) 1 => array(
'id' => '2',
'item_id' => '1',
'path' => 'tom_1_2'
)
)
),
(int) 1 => array(
'Item' => array(
'id' => '2',
'title' => 'tom item 2',
'seller_id' => '1'
),
'Seller' => array(
'id' => '1',
'name' => 'tom'
),
'Images' => array(
(int) 0 => array(
'id' => '3',
'item_id' => '2',
'path' => 'tom_2_1'
),
(int) 1 => array(
'id' => '4',
'item_id' => '2',
'path' => 'tom_2_2'
)
)
),
...
单个卖家+相关项目:
// In SellersController.php
debug($this->Seller->find('first',
array('conditions' => array('id' => $id), 'recursive' => 2)));
产生
array(
'Seller' => array(
'id' => '1',
'name' => 'tom'
),
'Item' => array(
(int) 0 => array(
'id' => '1',
'title' => 'tom item 1',
'seller_id' => '1',
'Seller' => array(
'id' => '1',
'name' => 'tom'
),
// Look! 'Images' is WITHIN 'Item !!!
'Images' => array(
(int) 0 => array(
'id' => '1',
'item_id' => '1',
'path' => 'tom_1_1'
),
(int) 1 => array(
'id' => '2',
'item_id' => '1',
'path' => 'tom_1_2'
)
)
),
(int) 1 => array(
'id' => '2',
'title' => 'tom item 2',
'seller_id' => '1',
'Seller' => array(
'id' => '1',
'name' => 'tom'
),
'Images' => array(
(int) 0 => array(
'id' => '3',
'item_id' => '2',
'path' => 'tom_2_1'
),
(int) 1 => array(
'id' => '4',
'item_id' => '2',
'path' => 'tom_2_2'
)
)
),
....
答案 0 :(得分:1)
这是预期且正确的行为,因为Image
与Seller
没有直接关联,而是Item
。
想象一下,如果Image
与Item
在同一级别定义,您将如何确定正确的关联?这表明与Seller
的关联并不存在。
如果您需要不同的结构,请在afterFind
回调或适当的地方进行格式化。但是,我不建议尝试违反CakePHP标准。如果适用,请调整您的视图代码。
答案 1 :(得分:0)
我的问题不明确。如果只是想阻止Image进入第二种情况,请尝试这个
$this->Seller->Item->unbindModel(array(
'hasMany' => array('Image')
));
$result = $this->Seller->find('first',
array('conditions' => array('id' => $id), 'recursive' => 2)));
debug($result);