Ограничение QueryBuilder работает только для первой строки в 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,

            }
        ]
    }]

Требуется только первая запись кампании_видео. Здесь, после использования запроса queryBuilder, я получаю вывод вроде.

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

            },

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

        "campaign_videos": [

        ]
    }]

Я не получаю никаких данных для второго идентификатора, хотя данные для него присутствуют. Пожалуйста, предложите мне. Заранее спасибо.


person sradha    schedule 18.05.2016    source источник
comment
Ой, я не заметил, что мои недавно приобретенные способности тега cakephp позволяют закрывать вопросы одним голосом. Я не был уверен на 100%, но я думаю, что это то, что вы пытаетесь сделать - извините, если это не так! Если ваша проблема отличается, пожалуйста, уточните ее, и я проголосую за ее повторное открытие в случае необходимости.   -  person ndm    schedule 18.05.2016
comment
Вы можете использовать func()-›min(), которая работала на cakephp3.1, но не на cakephp3.2+ book.cakephp.org/3.0/en/orm/query-builder.html   -  person Fury    schedule 22.08.2016


Ответы (1)


Возможно, я ошибаюсь (поэтому не стесняйтесь понизить мой ответ), но я думаю, что это невозможно с помощью простого запроса.

на самом деле торт при загрузке связанных данных делает один запрос к связанной таблице и после этого сопоставляет строки с соответствующими строками в основной таблице.

Таким образом, вам нужно будет выполнить запрос mysql, который найдет первую запись каждой категории. то есть что-то вроде того, что описано в этом статья

Я думаю, что единственное (или, может быть, более простое) решение - перебрать ваши записи:

$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);
}
person arilia    schedule 18.05.2016