CakePHP:为什么检索的数据格式取决于调用哪个关联模型

时间:2014-04-04 10:57:27

标签: cakephp cakephp-2.4

我有一个网站,里面有通常的卖家,商品和图片。模型看起来像这样:

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'
            )
        )
    ),
....

2 个答案:

答案 0 :(得分:1)

这是预期且正确的行为,因为ImageSeller没有直接关联,而是Item

想象一下,如果ImageItem在同一级别定义,您将如何确定正确的关联?这表明与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);