QueryBuilder限制仅适用于cakephp 3.2中的第一行

时间:2016-05-18 06:50:50

标签: php cakephp cakephp-3.x cakephp-3.2

我是Cakephp 3.2 v的新手。 这里我使用了模型关联(hasMany)。 在绑定部分(campaign_videos)中,我想只获取一条记录, 所以为此,我已经下面的代码来管理它。 我在db。中的实际数据。

[
    {
        "id": 1,
        "user_id": 95,

        "campaign_videos": [
            {
                "id": 1,
                "campaign_id": 1,

            },
            {
                "id": 3,
                "campaign_id": 1,

            }
        ]
    },
    {
        "id": 2,
        "user_id": 95,

        "campaign_videos": [
            {
                "id": 2,
                "campaign_id": 2,

            }
        ]
    },
  $fetchCampaignFirst = $this->Campaigns->find()->contain(['CampaignVideos' => ['queryBuilder' => function ($q) {
                            return $q->limit(1);
                        }]]);

我获得此限制仅适用于第一个数据,而不适用于其他数据(其他人甚至不显示获取的数据)。

下面我写了输出

这里我希望得到像

这样的输出
[
    {
        "id": 1,
        "user_id": 95,
         "campaign_videos": [
            {
                "id": 1,
                "campaign_id": 1,

            },
         ]
    },
    {
        "id": 2,
        "user_id": 95,

        "campaign_videos": [
            {
                "id": 2,
                "campaign_id": 2,

            }
        ]
    }]

只想要第一张campaign_videos记录。 在使用queryBuilder查询之后,我就像使用了。

[
    {
        "id": 1,
        "user_id": 95,
         "campaign_videos": [
            {
                "id": 1,
                "campaign_id": 1,

            },

        ]
    },
    {
        "id": 2,
        "user_id": 95,

        "campaign_videos": [

        ]
    }]

我没有获得第二个id的任何数据,而数据存在。 请建议我。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

也许我错了(所以我可以自由地回答我的答案),但我认为使用简单的查询是不可行的

实际上,在加载相关数据时,cake会在关联表上执行单个查询,然后在主表中匹配具有相应数据的行。

所以你需要做一个查找每个类别的第一条记录的mysql查询。即类似于article

中描述的内容

我认为唯一(或者更简单)解决方案是遍历您的记录:

$campaigns= $this->Campaigns->find();

foreach($campaigns as $campaign)
{
    $campaign->campaign_videos = $this->Campaigns->CampaignVideos-find()
        ->where(['campaign_id' => $campaign->id]
        ->order(['id' => 'asc'])
        ->limit(1);
}