Строим блог на Areto фреймворк

Модель метки

Класс Tag отвечает за тематические метки, которым соответствует статья.

Поиск статей по метке

В статическом методе getConstants определите таблицу, сохраняемые атрибуты и правила валидации для проверки введенных пользователем меток при поиске статей.

models/Tag.js

'use strict';
const Base = require('areto/db/ActiveRecord');
module.exports = class Tag extends Base {

  static getConstants () {
    return {
      TABLE: 'tag',
      STORED_ATTRS: ['name'],
      RULES: [
        ['name', 'required'],
        ['name', 'string', {min:2, max:32}]
      ]
    };
  }

  getTitle () {
    return this.get('name');
  }

  // place methods here
};
module.exports.init(module);
const Article = require('./Article');
...

Метка может относиться к нескольким статьям, а статья может быть связана с множеством меток. Именно такой тип связи - многие ко многим - реализуется в отношение relArticles. Для этого используется промежуточная таблица rel_article_tag, которая хранит идентификаторы пар метка - статья.

Таблица связи rel_article_tag не отражена в моделях. Все изменения в ней происходят автоматически, при редактировании отношений метка - статья в модуле администрирования блога.

В параметрах [Article.PK, 'articleId'] указывается связь статьи с записью в промежуточной таблице, а в параметрах ['tagId', this.PK] связь записи в промежуточной таблице с меткой. Таким образом определяются связанные статья и метка, которые ссылаются на одну запись в rel_article_tag.

В публичной части блога на условие отбора по метке дополнительно накладывается фильтр, который возвращает только опубликованные статьи. Также указывается требование загрузить вместе с моделью Article ее отношения mainPhoto, tags, которые будут использованы в представлении статьи.

models/Tag.js

...
relArticles () {
  return this.hasMany(Article, [Article.PK, 'articleId'])
    .where({status: Article.STATUS_PUBLISHED})
    .with('mainPhoto', 'tags')
    .viaTable('rel_article_tag', ['tagId', this.PK]);
}
...