CakePHP получает только те результаты, которые связаны с моделью - PullRequest
0 голосов
/ 12 июня 2019

В моем проекте CakePHP 2 у меня есть проекты, которые имеют много статей, статья может принадлежать многим проектам (отношение многих ко многим).

Теперь я хотел бы найти все проекты, которые имеютстатья.Мой текущий код для получения проектов выглядит следующим образом:

$projects = $this->Project->find('list', array(
    'fields' => array('Project.slug', 'Project.name')
));

Я попытался добавить содержание к запросу, без результатов

$projects = $this->Project->find('list', array(
    'contain' => array('PressArticles' => array()),
    'fields' => array('Project.slug', 'Project.name')
));

Как я могу изменить это, чтобы я получил всепроекты, у которых есть статья?

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

В вашей Project модели вы можете сделать

public $hasMany = array(
        'PressArticle' => array(
            'className' => 'PressArticle',
            'foreignKey' => 'project_id'
        )
    );

Для получения дополнительной информации, проверьте здесь

0 голосов
/ 12 июня 2019

Содержимое не поможет, отношения не 1: 1 будут извлечены в отдельном запросе, так что это не повлияет на ваш основной запрос.

Например, вы можете создать * 1003 вручную.* присоединяется к таблице объединения и целевой таблицы, которая автоматически отфильтровывает все проекты, у которых нет связанных статей, что-то в этом роде (я более или менее угадал названия, это просто быстрый и грязный пример):

$projects = $this->Project->find('list', array(
    'fields' => array('Project.slug', 'Project.name'),
    'joins' => array(
        array(
            'table' => 'press_articles_projects',
            'alias' => 'PressArticleProject',
            'type' => 'INNER',
            'conditions' => array(
                'PressArticleProject.project_id = Project.id',
            ),
        ),
        array(
            'table' => 'press_articles',
            'alias' => 'PressArticle',
            'type' => 'INNER',
            'conditions' => array(
                'PressArticle.id = PressArticleProject.press_article_id',
            ),
        )
    ),
    'group' => 'Project.id'
));

Или, если вы используете кеш счетчика, то фильтрация по счетчику также будет возможна:

$projects = $this->Project->find('list', array(
    'fields' => array('Project.slug', 'Project.name'),
    'conditions' => array(
        'Project.press_article_count >' => 0
    )
));

См. Также

...