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

Posted

技术标签:

【中文标题】根据字段的最小值从相关表中加入单个项目【英文标题】:Join single item from related table based on min of field 【发布时间】:2014-02-20 03:14:43 【问题描述】:

我有一个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

这样做的目的基本上是为了在索引中我可以显示项目列表和与每个项目关联的图片。我想要单个Item 中的所有图像以及Project 数据中的Project 数据,但不在列表/索引中。

有人告诉我我可以像这样使用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】:

你能试试这个吗:

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

在文件部分,您可以根据您的要求分配或不分配“项目”、“项目”。

谢谢

【讨论】:

这似乎确实适用于添加 ItemPic 的东西,我可以删除 Project 的东西,这很好。但是,我现在得到重复的数据。我在不同的行中获得每张与它相关联的图片的项目 1,而不仅仅是具有最低排名限制 1 图片的项目 1。 这是它与上述内容一起使用的查询:pastebin.com/1VWXXGTy(我还注意到它仍在加入Project。这是(修剪下来的)结果数组:pastebin.com/nQkMUiCG跨度> 我假设joins 数组中的orderlimit 字段不起作用(或者至少不是我预期的那样)。 你能告诉我你用的是哪个版本的蛋糕吗? 我标记了它,我使用的是 2.4

以上是关于根据字段的最小值从相关表中加入单个项目的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 根据数组值从 Parse 表中加载

Python:不仅根据值,还根据其他参与者的最小距离对选择单个最小距离对

如何在需要按一个键列分组的 3 个表中加入和求和值

查询及删除重复记录

SQL查询某字段最小值对应的行

cakephp 4 - 如何从相关表中查找最大值和最小值