2015-12-04 9 views
5

Ho due modelli che sono correlati attraverso una relazione hasMany.loopback salvato hamany modelli in singola richiesta

Customer hasMany CustomerPhones

Quando si crea una nuova Customer, vorrei passare il relativo CustomerPhones come parte di una singola richiesta. Questo sembra un bisogno comune, se l'approccio che sto cercando di implementare in modo sbagliato, qual è il modo preferito di farlo?

Questo è l'URL per la creazione di un cliente: POST /api/Customers

La richiesta di cui sopra url sarebbe req.body modelli

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

loopback configurazioni:

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" 
    } 
    } 
} 

risposta

0

Se si utilizza il connettore di database NoSQL, allora si potrebbe ignorare un altro modello CustomerPhone e aggiungere la proprietà customerPhones come un array nel modello Customer.

Altrimenti per il connettore del database SQL, è possibile creare un metodo remoto che esegua sia POST /api/Customers sia POST /api/Customers/id/CustomerPhones insieme. Per più numeri di telefono è possibile iterare il campo customerPhones nel req.body ed eseguire POST /api/Customers/id/CustomerPhones ogni volta.

+0

Sto usando SQL. Quello che stai suggerendo è quello che fondamentalmente ho finito per fare. Ho creato un nuovo RemoteMethod denominato create. – MentalGrinds

+0

Penso che non ci sia altro modo per fare ciò poiché 'CustomerPhones' dipende dall'oggetto' Cliente' per la relazione 'appartiene a 'al lavoro. –

1

Se questo potrebbe essere di aiuto, invece di iterazione è possibile inserire i numeri in un unico passaggio come questo:

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

Sto volendo fondamentalmente creare un nuovo cliente e nuovi telefoni nella stessa chiamata. Poiché il cliente non esiste ancora, non posso utilizzare il cliente /: id/telefoni. Il cliente non lo sa ancora. – MentalGrinds

1

Non sono sicuro se questa è la soluzione migliore, ma qui quello che ho finito fare. Ho creato un nuovo RemoteMethod denominato createNew sul cliente. All'interno di questo nuovo metodo remoto utilizzo i metodi aggiunti attraverso le relazioni del modello.

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; 
    }); 
}; 

per rendere questo un po 'più sicuro ho bisogno di avvolgerlo in una transazione. Speravo di usare i metodi CRUD di base, ma questa soluzione se abbastanza pulita.

Problemi correlati