У меня есть две модели, которые связаны отношениями HABTM:
- новостные статьи
- теги
Новостная статья может иметь несколько тегов и тег может принадлежать многим различным новостным статьям.
Когда я запрашиваю новостную статью по идентификатору, мой вывод должен быть массивом с полями новостной статьи, а также всеми связанными тегами этой новостной статьи. Когда я пытаюсь использовать сдерживаемое поведение, в выходном массиве нет тегов, и это довольно странно. Вот мой запрос:
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](https://i.stack.imgur.com/AmjlI.jpg)
Таблица "news_articles_tags"
![enter image description here](https://i.stack.imgur.com/ULqF4.jpg)
Таблица "тегов"
![enter image description here](https://i.stack.imgur.com/g8exn.jpg)
Модель "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» в качестве резервного плана;)