React Native
...
Data objects
1:N Relationship
11 min
relação um para muitos introdução no cerne de muitos backends, você encontrará a capacidade de armazenar dados usando o parse, você pode armazenar objetos de dados estabelecendo relações entre eles as relações de dados padronizam como cada objeto de dados está relacionado ou associado a outros isso pode lhe dar um poder extra ao construir e executar consultas complexas existem três tipos principais de relação um para muitos um para muitos , onde um objeto pode estar relacionado a muitos outros objetos; um para um um para um , estabelecendo relações diretas entre dois objetos e apenas eles; muitos para muitos muitos para muitos , que pode criar muitas relações complexas entre muitos objetos neste guia, focaremos na relação mais comum, a um para muitos os backends de armazenamento de dados geralmente exigem declarações explícitas dessas associações e até mesmo requerem que você crie, por conta própria, tabelas relacionais para gerenciar suas junções o parse faz isso automaticamente para você, removendo qualquer possibilidade de erros ao construir suas relações de dados e acelerando seu processo de modelagem de aplicativos existem duas maneiras de criar uma relação de um para muitos no parse a primeira é usando os parse object parse object pointers, que é a mais rápida em tempo de criação e consulta a segunda é usando arrays arrays que podem levar a tempos de consulta lentos dependendo de seu tamanho por causa desse problema de desempenho, usaremos apenas exemplos de pointers a partir de agora neste guia, você implementará um aplicativo de registro de livros em react native que contém os três principais tipos de associações de dados você aprenderá como criar e consultar relações de dados de um para muitos usando seu back4app e react native a qualquer momento, você pode acessar este projeto através de nossos repositórios do github para conferir os estilos e o código completo repositório de exemplo em javascript repositório de exemplo em typescript pré requisitos para completar este tutorial, você precisará um aplicativo react native criado e conectado a back4app se você quiser testar/utilizar o layout de tela fornecido por este guia, você deve configurar o react native paper react native paper biblioteca objetivo usar a relação um para muitos do parse para modelar um aplicativo de loja de livros em react native 1 compreendendo a classe livro como usaremos um exemplo de aplicação de registro de livros neste guia, você precisa primeiro entender como as relações de objetos estão dispostas neste banco de dados a principal classe de objeto que você usará é a livro livro classe, armazenando cada entrada de livro no registro além disso, estas são as outras quatro classes de objeto editora editora nome da editora do livro, relação de um para muitos com livro livro gênero gênero gênero do livro, relação de um para muitos com livro livro note que para este exemplo consideraremos que um livro pode ter apenas um gênero; autor autor autor do livro, relação de muitos para muitos com livro livro , uma vez que um livro pode ter mais de um autor e um autor pode ter mais de um livro também; isdb isdb número identificador isdb do livro, relação de um para um com livro livro , uma vez que este número é único para cada livro aqui está uma representação visual dessas tabelas de banco de dados para simplificar, vamos assumir que cada classe de objeto tem apenas um tipo de string nome nome atributo ( título título para o livro livro ), além de qualquer atributo relacional adicional 2 criando relações de um para muitos antes de entrar nesta etapa, recomendamos que você clone e execute o exemplo do aplicativo da biblioteca react native ( repositório de exemplo em javascript , repositório de exemplo em typescript ) este aplicativo tem duas telas principais uma responsável por listar os livros registrados e a outra por criar novos livros no formulário de registro de livros, há links diretos para os outros objetos relacionados, então, quando um usuário escolhe uma opção de editora ou gênero, os campos do formulário conterão a completa parse object parse object instância vamos dar uma olhada no método de criação de livro que é chamado ao enviar este formulário javascript 1 const createbook = async function () { 2 try { 3 // these values come from state variables linked to 4 // the screen form fields, retrieving the user choices 5 // as a complete parse object, when applicable; 6 const booktitlevalue = booktitle; 7 const bookisbdvalue = bookisbd; 8 // for example, bookpublisher holds the value from 9 // radiobutton group field with its options being every 10 // publisher parse object instance saved on server, which is 11 // queried on screen load via useeffect 12 const bookpublisherobject = bookpublisher; 13 const bookgenreobject = bookgenre; 14 // bookauthors can be an array of parse objects, since the book 15 // may have more than one author 16 const bookauthorsobjects = bookauthors; 17	 18 // creates a new parse object instance 19 let book = new parse object('book'); 20	 21 // set data to parse object 22 // simple title field 23 book set('title', booktitlevalue); 24	 25 // 1 1 relation, need to check for uniqueness of value before creating a new isbd object 26 let isbdquery = new parse query('isbd'); 27 isbdquery equalto('name', bookisbdvalue); 28 let isbdqueryresult = await isbdquery first(); 29 if (isbdqueryresult !== null && isbdqueryresult !== undefined) { 30 // if first returns a valid object instance, it means that there 31 // is at least one instance of isbd with the informed value 32 alert alert( 33 'error!', 34 'there is already an isbd instance with this value!', 35 ); 36 return false; 37 } else { 38 // create a new isbd object instance to create a one to one relation on saving 39 let isbd = new parse object('isbd'); 40 isbd set('name', bookisbdvalue); 41 isbd = await isbd save(); 42 // set the new object to the new book object isbd field 43 book set('isbd', isbd); 44 } 45	 46 // one to many relations can be set in two ways 47 // add direct object to field (parse will convert to pointer on save) 48 book set('publisher', bookpublisherobject); 49 // or add pointer to field 50 book set('genre', bookgenreobject topointer()); 51	 52 // many to many relation 53 // create a new relation so data can be added 54 let authorsrelation = book relation('authors'); 55 // bookauthorsobjects is an array of parse objects, 56 // you can add to relation by adding the whole array or object by object 57 authorsrelation add(bookauthorsobjects); 58	 59 // after setting the values, save it on the server 60 try { 61 await book save(); 62 // success 63 alert alert('success!'); 64 navigation goback(); 65 return true; 66 } catch (error) { 67 // error can be caused by lack of internet connection 68 alert alert('error!', error message); 69 return false; 70 } 71 } catch (error) { 72 // error can be caused by lack of value selection 73 alert alert( 74 'error!', 75 'make sure to select valid choices in publisher, genre and author fields!', 76 ); 77 return false; 78 } 79 };1 const createbook = async function () promise\<boolean> { 2 try { 3 // these values come from state variables linked to 4 // the screen form fields, retrieving the user choices 5 // as a complete parse object, when applicable; 6 const booktitlevalue string = booktitle; 7 const bookisbdvalue string = bookisbd; 8 // for example, bookpublisher holds the value from 9 // radiobutton group field with its options being every 10 // publisher parse object instance saved on server, which is 11 // queried on screen load via useeffect 12 const bookpublisherobject parse object = bookpublisher; 13 const bookgenreobject parse object = bookgenre; 14 // bookauthors can be an array of parse objects, since the book 15 // may have more than one author 16 const bookauthorsobjects \[parse object] = bookauthors; 17	 18 // creates a new parse object instance 19 let book parse object = new parse object('book'); 20	 21 // set data to parse object 22 // simple title field 23 book set('title', booktitlevalue); 24	 25 // 1 1 relation, need to check for uniqueness of value before creating a new isbd object 26 let isbdquery parse query = new parse query('isbd'); 27 isbdquery equalto('name', bookisbdvalue); 28 let isbdqueryresult parse object = await isbdquery first(); 29 if (isbdqueryresult !== null && isbdqueryresult !== undefined) { 30 // if first returns a valid object instance, it means that there 31 // is at least one instance of isbd with the informed value 32 alert alert( 33 'error!', 34 'there is already an isbd instance with this value!', 35 ); 36 return false; 37 } else { 38 // create a new isbd object instance to create a one to one relation on saving 39 let isbd parse object = new parse object('isbd'); 40 isbd set('name', bookisbdvalue); 41 isbd = await isbd save(); 42 // set the new object to the new book object isbd field 43 book set('isbd', isbd); 44 } 45	 46 // one to many relations can be set in two ways 47 // add direct object to field (parse will convert to pointer on save) 48 book set('publisher', bookpublisherobject); 49 // or add pointer to field 50 book set('genre', bookgenreobject topointer()); 51	 52 // many to many relation 53 // create a new relation so data can be added 54 let authorsrelation = book relation('authors'); 55 // bookauthorsobjects is an array of parse objects, 56 // you can add to relation by adding the whole array or object by object 57 authorsrelation add(bookauthorsobjects); 58	 59 // after setting the values, save it on the server 60 try { 61 await book save(); 62 // success 63 alert alert('success!'); 64 navigation goback(); 65 return true; 66 } catch (error) { 67 // error can be caused by lack of internet connection 68 alert alert('error!', error message); 69 return false; 70 } 71 } catch (error) { 72 // error can be caused by lack of value selection 73 alert alert( 74 'error!', 75 'make sure to select valid choices in publisher, genre and author fields!', 76 ); 77 return false; 78 } 79 }; veja como o bookpublisherobject bookpublisherobject e bookgenreobject bookgenreobject estão configurados para o novo livro parse object parse object instância veja como é simples no parse criar uma relação de um para muitos você pode atribuir a instância do objeto alvo ou um ponteiro para ele usando o parse object set parse object set método, que aceita dois argumentos o nome do campo e o valor a ser definido o parse criará uma coluna de tipo de dado ponteiro e um link direto no seu painel para acesso rápido nos bastidores clicar no valor do ponteiro do objeto no seu painel o levará à entrada do objeto referenciado pode parecer um recurso inofensivo, mas isso torna a depuração e o rastreamento de erros muito mais rápidos do que procurá lo manualmente 3 consultando relações de um para muitos consultar objetos relacionados um para muitos é bastante simples, pois grande parte disso é gerenciada pelo parse dê uma olhada na função de consulta na tela da lista de registros do livro javascript 1 const querybooks = async function () { 2 // these values come from state variables linked to 3 // the screen query radiobutton group fields, with its options being every 4 // parse object instance saved on server from the referred class, which is 5 // queried on screen load via useeffect; these variables retrievie the user choices 6 // as a complete parse object; 7 const querypublishervalue = querypublisher; 8 const querygenrevalue = querygenre; 9 const queryauthorvalue = queryauthor; 10 const queryisbdvalue = queryisbd; 11	 12 // reading parse objects is done by using parse query 13 const parsequery = new parse query('book'); 14	 15 // one to many queries 16 if (querypublishervalue !== '') { 17 parsequery equalto('publisher', querypublishervalue); 18 } 19 if (querygenrevalue !== '') { 20 parsequery equalto('genre', querygenrevalue); 21 } 22	 23 // one to one query 24 if (queryisbdvalue !== '') { 25 parsequery equalto('isbd', queryisbdvalue); 26 } 27	 28 // many to many query 29 // in this case, we need to retrieve books related to the chosen author 30 if (queryauthorvalue !== '') { 31 parsequery equalto('authors', queryauthorvalue); 32 } 33	 34 try { 35 let books = await parsequery find(); 36 // many to many objects retrieval 37 // in this example we need to get every related author parse object 38 // and add it to our query result objects 39 for (let book of books) { 40 // this query is done by creating a relation and querying it 41 let bookauthorsrelation = book relation('authors'); 42 book authorsobjects = await bookauthorsrelation query() find(); 43 } 44 setqueriedbooks(books); 45 return true; 46 } catch (error) { 47 // error can be caused by lack of internet connection 48 alert alert('error!', error message); 49 return false; 50 } 51 };1 const querybooks = async function () promise\<boolean> { 2 // these values come from state variables linked to 3 // the screen query radiobutton group fields, with its options being every 4 // parse object instance saved on server from the referred class, which is 5 // queried on screen load via useeffect; these variables retrievie the user choices 6 // as a complete parse object; 7 const querypublishervalue parse object = querypublisher; 8 const querygenrevalue parse object = querygenre; 9 const queryauthorvalue parse object = queryauthor; 10 const queryisbdvalue parse object = queryisbd; 11	 12 // reading parse objects is done by using parse query 13 const parsequery parse query = new parse query('book'); 14	 15 // one to many queries 16 if (querypublishervalue !== '') { 17 parsequery equalto('publisher', querypublishervalue); 18 } 19 if (querygenrevalue !== '') { 20 parsequery equalto('genre', querygenrevalue); 21 } 22	 23 // one to one query 24 if (queryisbdvalue !== '') { 25 parsequery equalto('isbd', queryisbdvalue); 26 } 27	 28 // many to many query 29 // in this case, we need to retrieve books related to the chosen author 30 if (queryauthorvalue !== '') { 31 parsequery equalto('authors', queryauthorvalue); 32 } 33	 34 try { 35 let books \[parse object] = await parsequery find(); 36 // many to many objects retrieval 37 // in this example we need to get every related author parse object 38 // and add it to our query result objects 39 for (let book of books) { 40 // this query is done by creating a relation and querying it 41 let bookauthorsrelation = book relation('authors'); 42 book authorsobjects = await bookauthorsrelation query() find(); 43 } 44 setqueriedbooks(books); 45 return true; 46 } catch (error) { 47 // error can be caused by lack of internet connection 48 alert alert('error!', error message); 49 return false; 50 } 51 }; neste caso, para consultar quaisquer livros relacionados a um editor ou gênero específico, você só precisa realizar um parse query equalto parse query equalto método passando a parse object parse object instância como parâmetro após a consulta, o parse armazenará dentro dos objetos resultantes as instâncias completas de quaisquer campos relacionais um para muitos para recuperar e mostrar dados dessas instâncias de objeto, você pode encadear o parse object get parse object get método assim bookparseobject get(('publisher') get('name') bookparseobject get(('publisher') get('name') aqui está como a tela da lista se parece ao usar esses getters para recuperar os nomes do editor e do gênero dos itens da lista conclusão no final deste guia, você aprendeu como criar e consultar relações um para muitos no parse no react native no próximo guia, mostraremos como fazer consultas e relações muitos para muitos e um para um