根据最小字段从相关表中加入单个项目

时间:2014-02-20 03:14:44

标签: php mysql sql cakephp cakephp-2.4

我有一个Item模型,它具有以下关联:

public $hasOne = array(
    'Project' => array(
        'className' => 'Project',
        'foreignKey' => 'item_id'
    )
);
public $hasMany = array(
    'ItemPic' => array(
        'className' => 'ItemPic',
        'foreignKey' => 'item_id',
        'dependent' => false
    )
);

我想要Item的不同视图的自定义数据。 CakePHP似乎自动包含Project数据(可能因为它是hasOne?)而且不包含ItemPic数据。在index我甚至不想要Project数据...但是,我确实需要ItemPic数据。对于提取的每个Item记录,我希望加入一条ItemPic条记录。此ItemPic基本上应为ItemPic.item_id = Item.idORDER BY ItemPic.rank LIMIT 1

这样做的目的基本上是在索引中我可以显示一个项目列表和一个与每个项目相关的图片。我想将Project中的所有图片和view数据放在一个Item中,但不在列表/索引中。

我被告知我可以像这样使用containable

// In the model
public $actsAs = array('Containable');

// In the controller
$this->paginate = array(
    'conditions' => $conditions,
    'contain' => array(
        'ItemPic' => array(
            'fields' => array('file_name'),
            'order' => 'rank',
            'limit' => 1
        )
    )
);

以上实际上是我想要的...但是,我也被告知这样做会导致为每一个Item运行一个额外的查询...我觉得我应该避免。

我尝试过这样做,但是我收到了重复的数据并且它没有附加任何ItemPic数据:

    $this->paginate = array(
            'conditions' => $conditions,
            'joins' =>  array(
                    array(
                            'table' => 'item_pics',
                            'alias' => 'ItemPic',
                            'type' => 'LEFT',
                            'conditions' => array(
                                    'ItemPic.item_id = Item.id'
                            ),
                            'order' => 'rank ASC',
                            'limit' => 1
                    )

            )
    );
    $paginated = $this->Paginator->paginate();

1 个答案:

答案 0 :(得分:0)

请你试试这个:

$this->paginate = array(
        'conditions' => $conditions,
        'joins' =>  array(
                array(
                        'table' => 'item_pics',
                        'alias' => 'ItemPic',
                        'type' => 'LEFT',
                        'conditions' => array(
                                'ItemPic.item_id = Item.id'
                        ),
                        'order' => 'rank ASC',
                        'limit' => 1
                )

        ),
    'fields' => array('Item.*','Project.*','ItemPic.*') 
    );

在字段部分,您可能会或可能不会根据您的要求分配“项目”,“项目”。谢谢