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

Модель метки

Класс модели наследуется от Tag из публичной части блога.

Модель метки

Правило filter изменяет значение атрибута, указанным обработчиком. В данном случае trim отсекает пустые символы в начале и в конце названия метки. Правила применяются в порядке расположения, таким образом следующие за фильтром уже будут работать с измененным атрибутом.

Константа UNLINK_ON_REMOVE содержит связи, которые должны быть разорваны при удалении объекта метки. В противном случае связь будет содержать ссылку на несуществующий объект.

module/admin/model/Tag.js

const Base = require('../../../model/Tag');
module.exports = class Tag extends Base {
  static getConstants () {
    return {
      RULES: [
        ['name', 'required'],
        ['name', 'filter', {filter: 'trim'}],
        ['name', 'string', {min: 2, max: 32}],
        ['name', 'unique', {ignoreCase: true}]
      ],
      INDEXES: [[{name: 1}, {unique: true}]],
      UNLINK_ON_REMOVE: ['articles']
    };
  }
};
module.exports.init(module);
const Article = require('./Article');

Метод findByName ищет метки по указанному названию, но без учета регистра.

module/admin/model/Tag.js

static findByName (name) {
  return this.find({name: new RegExp(`^${name}$`, 'i')});
}

Метод findBySearch ищет метки, у которых название содержит указанный текст.

module/admin/model/Tag.js

static findBySearch (text) {
  return text
    ? this.find(['LIKE', 'name', `%${text}%`])
    : this.find();
}

Отношение relArticles определяет статьи, которые привязаны к метке. Метод переопределяет подобный из родительского класса, потому что в отношении используется модель статьи из модуля администрирования.

В метод hasMany последний аргумент true означает, что при разрыве связи запись о ней должна быть удалена. В данном случае удаляется запись из таблицы rel_article_tag.

module/admin/model/Tag.js

relArticles () {
  return this.hasMany(Article, Article.PK, 'articleId')
    .viaTable('rel_article_tag', 'tagId', this.PK)
    .removeOnUnlink();
}