2015-12-11 5 views
0

У меня есть модель Book.loopback: как загрузить экземпляры модели на основе свойства отношения

Book может иметь несколько тегов, так что есть отношения hasMany к Tag через BookTags

Теперь, как я могу загрузить все Book экземпляры с тегом «истории» (к примеру)? Это должно быть тривиально, но я не мог узнать.

В документации есть только примеры значений свойств (например, строки, булевы и т. Д.), Но нет примеров для загрузки через отношения. Существует фильтр include, который загружает отношения, но это должно применяться к экземплярам отношений загрузки, что является чем-то другим (AFAI понимает);

Я пробовал:

Book.find({ 
    where: {tags: {name: "history"}} 
}, function(err, books) { 
} 

Но это не работает. Моя следующая ставка пытается загрузить метку по идентификатору и попытаться отфильтровать объект, но я даже не знаю, как это сделать, так как нет «содержит» операторы в ИНЕКЕ документации: https://docs.strongloop.com/display/public/LB/Where+filter#Wherefilter-inq

конечный обходной путь заключается в следующем:

  • нагрузки тегов с помощью имени
  • нагрузок всех BookTags экземпляров с этим тегом идентификатором, получить книгу IdS
  • загрузить все книги с этими идентификаторами

Кажется громоздким и предполагает, что должно быть более элегантное решение?

ответ

0

Если у книги может быть много тегов, а у тега может быть много книг, похоже, что вам нужны отношения hasAndBelongsToMany. Это соотношение отлично подходит для многих-ко-многим, у которых нет дополнительной полезной нагрузки.

общие/модели/book.json

{ 
    "name": "Book", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "Title": { 
     "type": "string", 
     "required": true 
    }, 
    "Author": { 
     "type": "string" 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "tags": { 
     "type": "hasAndBelongsToMany", 
     "model": "Tag", 
     "foreignKey": "" 
    } 
    }, 
    "acls": [], 
    "methods": {} 
} 

общие/модели/tag.json

{ 
    "name": "Tag", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "Name": { 
     "type": "string", 
     "required": true 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "books": { 
     "type": "hasAndBelongsToMany", 
     "model": "Book", 
     "foreignKey": "" 
    } 
    }, 
    "acls": [], 
    "methods": {} 
} 

Как получить к нему доступ? Вот пример сценария загрузки, который создает некоторые теги и книги и обращается к ним.

сервера/загрузки/seed.js

var async = require('async'); 
module.exports = function(app) { 

    var Tag = app.models.Tag; 
    var Book = app.models.Book; 

    var tags = [{Name: "Scifi"}, {Name: "Adventure"}]; 

    Book.create({Title: "Twenty Thousand Leagues Under the Sea", author: "Jules Verne"}, function(err, book){ 
     console.log('Book: ' + book); 

     async.each(tags, function(tag, done){ 
      book.tags.create(tag, done); 
     }, function(err){ 
      //Book > Tag 
      console.log("Book " + book.Title + " has these tags: "); 
      console.log(book.tags()) 
      //Tag > Book 

      Tag.findOne({where: {Name: "Scifi"}, include: 'books'},function(err, foundTag){ 
       console.log(" - Tag " + foundTag.Name + " has these books:"); 
       console.log(foundTag.books()); 

      }); 
     }); 
    }); 
}; 

Выход:

Book Twenty Thousand Leagues Under the Sea has these tags: 
[ { Name: 'Scifi', id: 1 }, { Name: 'Adventure', id: 2 } ] 

Tag Scifi has these books: 
[ { 
    Title: 'Twenty Thousand Leagues Under the Sea', 
    author: 'Jules Verne', 
    id: 1 
} ] 
Смежные вопросы