Строим блог на основе Node.js MVC фреймворка Areto

Модель метки

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

Модель метки

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

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

modules/admin/models/Tag.js

'use strict';
const Base = require('../../../models/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}]
      ],            
      UNLINK_ON_REMOVE: ['articles']
    };
  }
};
module.exports.init(module);       
const Article = require('./Article');

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

modules/admin/models/Tag.js

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

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

modules/admin/models/Tag.js

...
static findBySearch (text) {
  let query = this.find();
  if (text) {
    query.where(['LIKE', 'name', `%${text}%`]);
  }
  return query;
}
...

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

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

modules/admin/models/Tag.js

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