Торт PHP 2: проблема с содержимым поведения в hasAndBelongsToMany - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть две модели, которые связаны отношениями HABTM:

  1. новостные статьи
  2. теги

Новостная статья может иметь несколько тегов и тег может принадлежать многим различным новостным статьям.

Когда я запрашиваю новостную статью по идентификатору, мой вывод должен быть массивом с полями новостной статьи, а также всеми связанными тегами этой новостной статьи. Когда я пытаюсь использовать сдерживаемое поведение, в выходном массиве нет тегов, и это довольно странно. Вот мой запрос:

public function getNewsArticle($id) {
    if (!$id || !is_numeric($id)) {
        throw new NotFoundException(
            __('Invalid id.')
        );
    }

    $newsArticle = $this->find('first', array(
        'recursive' => -1,
        'fields' => array(
            'NewsArticle.id',
            'NewsArticle.name',
            'NewsArticle.content',
            'NewsArticle.meta_description',
            'NewsArticle.meta_keywords',
            'NewsArticle.show',
            'NewsArticle.published'
        ),
        'contain' => array(
            'Tag' => array(
                'fields' => array(
                    'Tag.id',
                    'Tag.name',
                    'Tag.slug',
                    'Tag.show'
                )
            )
        ),
        'conditions' => array(
            'NewsArticle.id' => $id,
            'NewsArticle.deleted' => null
        )
    ));

    if (!$newsArticle) {
        throw new NotFoundException(
            __('Invalid news article.')
        );
    }

    return $newsArticle;
}

Выходные данные выглядят так:

array(
    'NewsArticle' => array(
        'id' => '225',
        'name' => 'test',
        'content' => '<p>test</p>
',
        'meta_description' => 'test',
        'meta_keywords' => 'test',
        'show' => 'Y',
        'published' => '2020-02-22 15:00:00'
    )
)

Когда я избавляюсь от поведения, содержащегося в моем запросе, выходные данные выглядят так:

array(
    'NewsArticle' => array(
        'id' => '225',
        'name' => 'test',
        'content' => '<p>test</p>
',
        'meta_description' => 'test',
        'meta_keywords' => 'test',
        'show' => 'Y',
        'published' => '2020-02-22 15:00:00'
    ),
    'NewsArticlePhoto' => array(),
    'NewsArticleComment' => array(),
    'Tag' => array(
        (int) 0 => array(
            'id' => '3',
            'name' => 'Tag 3',
            'slug' => 'tag-3',
            'show' => 'N',
            'created' => '2020-02-19 23:01:35',
            'modified' => '2020-02-19 23:01:35',
            'deleted' => null,
            'NewsArticlesTag' => array(
                'id' => '22',
                'news_article_id' => '225',
                'tag_id' => '3',
                'created' => '2020-02-22 15:00:55',
                'modified' => '2020-02-22 15:00:55',
                'deleted' => null
            )
        ),
        (int) 1 => array(
            'id' => '5',
            'name' => 'Tag 4',
            'slug' => 'tag-4',
            'show' => 'Y',
            'created' => '2020-02-19 23:02:20',
            'modified' => '2020-02-19 23:02:20',
            'deleted' => null,
            'NewsArticlesTag' => array(
                'id' => '23',
                'news_article_id' => '225',
                'tag_id' => '5',
                'created' => '2020-02-22 15:00:55',
                'modified' => '2020-02-22 15:00:55',
                'deleted' => null
            )
        )
    )
)

Я думаю, что это очень странное поведение, и я не уверен, что я делаю неправильно. Возможно, я допустил ошибку в соглашениях об именах? Или в названии модели? Вот еще немного отладочной информации, чтобы все было очень понятно.

Модель приложения плагина

class CoasterCmsAppModel extends Model
{
    public $actsAs = array(
        'Containable'
    );
}

Таблица "news_articles"

enter image description here

Таблица "news_articles_tags"

enter image description here

Таблица "тегов"

enter image description here

Модель "NewsArticle"

class NewsArticle extends CoasterCmsAppModel
{
    public $actsAs = array(
        'Slugable.Slugable' => array(
            'name' => 'slug'
        )
    );

    public $hasMany = array(
        'NewsArticlePhoto' => array(
            'className' => 'CoasterCms.NewsArticlePhoto',
            'foreignKey' => 'news_article_id',
            'conditions' => array(
                'NewsArticlePhoto.deleted' => null
            ),
            'order' => array(
                'NewsArticlePhoto.sequence' => 'asc',
                'NewsArticlePhoto.id' => 'asc'
            ),
            'dependent' => true // nieuwsartikel verwijderen = foto verwijderen
        ),
        'NewsArticleComment' => array(
            'className' => 'CoasterCms.NewsArticleComment',
            'foreignKey' => 'news_article_id',
            'conditions' => array(
                'NewsArticleComment.deleted' => null
            ),
            'order' => array(
                'NewsArticleComment.created' => 'desc',
                'NewsArticleComment.id' => 'desc'
            ),
            'dependent' => true // nieuwsartikel verwijderen = reactie verwijderen
        )
    );

    public $hasAndBelongsToMany  = array(
        'Tag' => array(
            'className' => 'CoasterCms.Tag',
            'joinTable' => 'news_articles_tags',
            'foreignKey' => 'news_article_id',
            'associationForeignKey' => 'tag_id'
        )
    );
}

Модель "Tag"

class Tag extends CoasterCmsAppModel
{
    public $actsAs = array(
        'Slugable.Slugable' => array(
            'name' => 'slug'
        )
    );

    public $hasAndBelongsToMany  = array(
        'NewsArticle' => array(
            'className' => 'CoasterCms.NewsArticle',
            'joinTable' => 'news_articles_tags',
            'foreignKey' => 'tag_id',
            'associationForeignKey' => 'news_article_id'
        )
    );
}

Я думаю, что допустил ошибку соглашения, но я не очень уверен в этом. Кто-нибудь может указать мне правильное направление? Если я не могу решить ее, я могу использовать отношение «hasMany through» в качестве резервного плана;)

...