2015-12-04 16 views
5

Mam dwa modele, które są powiązane za pośrednictwem relacji hasMany.sprzężenie zwrotne zapisz powiązane z nielicznymi modelami w jednym żądaniu

Customer hasMany CustomerPhones

Podczas tworzenia nowego Customer chciałbym przekazać powiązanego CustomerPhones jako część pojedynczego żądania. Wydaje się, że jest to powszechna potrzeba, jeśli podejście, które zamierzam wprowadzić w niewłaściwy sposób, jaki jest preferowany sposób na to?

Jest to adres URL do tworzenia klientów: POST /api/Customers

Wniosek o powyższym URL będzie req.body Modele

{ 
    "name": "Foo", 
    "customerPhones": [ 
    { "phoneNumber": "8085551234" }, 
    { "phoneNumber": "8085554567" } 
    ] 
} 

loopback konfiguracje:

Customer.json

{ 
    "name": "Customer", 
    "base": "User", 
    "properties": { 
    "name": { 
     "type": "string", 
     "required": true 
    } 
    }, 
    "relations": { 
    "customerPhones": { 
     "type": "hasMany", 
     "model": "CustomerPhone", 
     "foreignKey": "" 
    } 
    } 
} 

CustomerPhone.json

{ 
    "name": "CustomerPhone", 
    "base": "PersistedModel", 
    "properties": { 
    "phoneNumber": { 
     "type": "string", 
     "required": true 
    }, 
    "customerId": { 
     "type": "number", 
     "required": true 
    } 
    }, 
    "relations": { 
    "customer": { 
     "type": "belongsTo", 
     "model": "Customer", 
     "foreignKey": "customerId" 
    } 
    } 
} 

Odpowiedz

0

Jeśli używasz złącza bazy NoSQL, to można zignorować kolejny CustomerPhone model i dodać właściwość customerPhones jako tablica w modelu Customer.

W przypadku łącznika do bazy danych SQL można utworzyć metodę zdalną, która będzie jednocześnie wykonywać połączenia POST /api/Customers i POST /api/Customers/id/CustomerPhones. W przypadku wielu numerów telefonów można wykonać iterację pola customerPhones w jednostce o numerze porządkowym i wykonać za każdym razem POST /api/Customers/id/CustomerPhones.

+0

Używam SQL. To, co sugerujesz, w zasadzie skończyłem. Zrobiłem nowy RemoteMethod o nazwie create. – MentalGrinds

+0

Myślę, że nie ma innego sposobu na zrobienie tego, ponieważ 'CustomerPhones' jest zależny od obiektu' Customer', aby relacja 'belongsTo' działała. –

1

Jeśli to może być żadnej pomocy, zamiast iteracji można wstawić numery w jednym kroku tak:

curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "[{ 
     \"number\": \"1000\", 
     \"type\": \"mobile\", 
     \"customerId\": 1 
    }, { 
     \"number\": \"1004\", 
     \"type\": \"home\", 
     \"customerId\": 1 
    }, { 
     \"number\": \"1400\", 
     \"type\": \"work\", 
     \"customerId\": 1 
    }]" "http://127.0.0.1:3000/api/customers/1/phones" 
+0

Chcę w zasadzie utworzyć nowego klienta i nowe telefony w jednym połączeniu. Ponieważ klient jeszcze nie istnieje, nie mogę korzystać z Customer /: id/Phones. Identyfikator klienta nie jest jeszcze znany. – MentalGrinds

1

Nie jestem pewien, czy jest to najlepsze rozwiązanie, ale tutaj to, co skończyło do robienia. Stworzyłem nową usługę RemoteMethod o nazwie createNew na kliencie. W ramach tej nowej metody zdalnej korzystam z metod dodanych przez relacje modelu.

Customer.createNew = function (data) { 
    var newCustomerId; 
    var customerPhones = null; 

    if (data.customerPhones && data.customerPhones.length) { 
    customerPhones = data.customerPhones; 
    } 

    return Customer 
    .create(data) 
    .then(function createCustomerPhones (customer) { 
     newCustomerId = customer.id; 
     if (customerPhones) { 
     customer.customerPhones.create(customerPhones); 
     } 
    }) 
    .then(function fetchNewCustomerIncludeRelated() { 
     return Customer 
     .findById(newCustomerId, { 
      include: [ 'customerPhones' ] 
     }); 
    }) 
    .catch(function (err) { 
     return err; 
    }); 
}; 

Aby było to nieco bezpieczniejsze, będę musiał zawinąć je w transakcję. Miałem nadzieję, że użyję podstawowych metod CRUD, ale to rozwiązanie będzie dość czyste.