2015-07-22 3 views
3

Я пытаюсь использовать полиморфное отношение HasAndBelongsToMany при использовании uuids. Моя проблема заключается в том, что я не могу научить Strongloop использовать идентификатор с строкой как типом вместо числа в необходимой таблице «многие-ко-многим». Это приводит к ошибкам SQL при создании новых отношений.Strongloop: Полиморфный HasAndBelongsToMany отношение с uuids

Позвольте мне объяснить это на примере:

У меня есть две модели: CartCollection и корзина. В коллекции должны быть разные тележки, включая саму корзину. Корзина и CartCollection имеют uuids вместо простых идентификаторов. Показывать это как свойство в модели-json. Проблема заключается в полиморфных отношениях «многие-ко-многим» между ними. Я пытаюсь использовать полиморфное отношение HasAndBelongsToMany, чтобы понять это. В этой таблице я также пытаюсь переопределить тип id.

Это мой JSON-код:

{ 
    "name": "SaleCartCollection", 
    "plural": "SaleCartCollections", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "id": { 
     "type": "string", 
     "length": 36, 
     "id": true 
    }  
    }, 
    "validations": [], 
    "relations": { 
    "saleCartsPoly": { 
     "type": "hasMany", 
     "model":"SaleCart", 
     "polymorphic" : { 
     "as": "saleCartsPoly", 
     "invert": true 
     }, 
     "through": "SaleCartCartCollectionLink" 
    } 
    }, 
    "acls": [], 
    "methods": [] 
} 

{ 
    "name": "SaleCart", 
    "plural": "SaleCarts", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "id": { 
     "type": "string", 
     "length": 36, 
     "id": true 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "SaleCartCollections": { 
     "type": "hasAndBelongsToMany", 
     "model": "SaleCartCollection", 
     "polymorphic": { 
     "as":"saleCartsPoly", 
     "foreignKey" : "saleCartsPolyId", 
     "discriminator" : "saleCartsPolyType" 
     }, 
     "through": "SaleCartCartCollectionLink" 
    } 
    }, 
    "acls": [], 
    "methods": [] 
} 

{ 
    "name": "SaleCartCartCollectionLink", 
    "base": "PersistedModel", 
    "properties": { 
    "saleCartsPolyId": { 
     "type": "string", 
     "length": 36 
    } 
    }, 
    "validations": [], 
    "relations": { 
    }, 
    "acls": [], 
    "methods": [] 
} 

Если теперь я пытаюсь создать новую CartCollection в существующую корзину, я получаю этот выход:

loopback:connector:mysql SQL: INSERT INTO `SaleCartCartCollectionLink`(`saleCartsPolyId`,`saleCartsPolyType`,`saleCartCollectionId`) VALUES(?,?,?), params: [null,"SaleCart","bad7a6fc-1798-49c5-a0cb-fa59eba5b3a4"] +8ms 
loopback:connector:mysql Error: {"code":"ER_BAD_FIELD_ERROR","errno":1054,"sqlState":"42S22","index":0} +11ms 

я узнал, что это потому что Strongloop игнорирует мое определение свойства в сквозной модели. Это еще целый ряд, как вы можете видеть здесь, в модели-схемы в проводнике:

[ 
    { 
    "saleCartsPolyId": 0, 
    "id": 0, 
    "saleCartsPolyType": "", 
    "saleCartCollectionId": "" 
    } 
] 

ли кто-нибудь имеет представление о том, если я делаю что-то неправильно, или это ошибка в Strongloop?

С наилучшими пожеланиями

Никлас

ответ

1

Я сотрудник из Никлас, и мы решили нашу проблему следующим образом.

Определим

  • в "Корзина hasMany CartCollection через CartCartCollectionLink" отношение полиморфный "как корзина"
  • "CartCollection hasMany Корзина через CartCartCollectionLink" полиморфный "как cartCollection"
  • и здесь приходит важно part: two polymorphic "CartCartCollectionLink принадлежит [Cart | CartCollection]" отношения полиморфные "с полиморфным.идом Тип: строка!

Интересная часть заключается в том, что свойство idType установлено неправильно для отношений HasAndBelongsToMany.

Кто-то, возможно, захотите взглянуть на реляционными definition.js: 1566:

if (params.polymorphic) { 
    var polymorphic = polymorphicParams(params.polymorphic); 
    options.polymorphic = polymorphic; // pass through 
    var accessor = params.through.prototype[polymorphic.as]; 
    if (typeof accessor !== 'function') { // declare once 
     // use the name of the polymorphic rel, not modelTo 

     // *** you might want to set idType here: *** 
     params.through.belongsTo(polymorphic.as, { polymorphic: true }); 
    } 
    } 

CartCartCollectionLink.json

{ 
    "name": "SaleCartCartCollectionLink", 
    "relations": { 
    "saleCarts": { 
     "type": "belongsTo", 
     "model": "SaleCart", 
     "foreignKey": "saleCartId", 
     "polymorphic": { 
     "as": "saleCart", 
     "idType": "string" 
     } 
    }, 
    "saleCartCollections": { 
     "type": "belongsTo", 
     "model": "SaleCartCollection", 
     "foreignKey": "saleCartCollectionId", 
     "polymorphic": { 
     "as": "saleCartCollection", 
     "idType": "string" 
     } 
    } 
    } 
} 

Cart.json

{ 
    "name": "SaleCart", 
    "properties": { 
    "id": { 
     "type": "string", 
     "length": 36, 
     "id": true 
    } 
    }, 
    "relations": { 
    "saleCartCollections": { 
     "type": "hasMany", 
     "model": "SaleCartCollection", 
     "foreignKey": "saleCartId", 
     "through": "SaleCartCartCollectionLink", 
     "polymorphic": { 
     "as": "saleCart" 
     } 
    } 
    } 
} 

CartCollection.

JSON
{ 
    "name": "SaleCartCollection", 
    "properties": { 
    "id": { 
     "type": "string", 
     "length": 36, 
     "id": true 
    } 
    }, 
    "relations": { 
    "saleCarts": { 
     "type": "hasMany", 
     "model": "SaleCart", 
     "foreignKey": "saleCartCollectionId", 
     "through": "SaleCartCartCollectionLink", 
     "polymorphic": { 
     "as": "saleCartCollection" 
     } 
    } 
    } 
} 
+0

Спасибо за ответ, на самом деле основаны на этом: [ссылка] (https://docs.strongloop.com/display/APIC/HasAndBelongsToMany+relations), он должен работать с типом hasAndBelongsToMany. Правда, я настроил это для моделей с каждой стороны, возможно, он должен быть настроен только на одном из двух моделей «многие-ко-многим». В любом случае, ваше предложение, основанное на анализе файлов js, решило мою проблему. Спасибо. – kensai

Смежные вопросы