我有一个具有以下关联的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();

最佳答案

您能尝试一下吗?

$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.*')
    );

在字段部分,您可以根据需要分配或不分配“ Item”和“ Project”。
谢谢

关于php - 根据字段的最小值联接相关表中的单个项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21897352/

10-11 02:45