React Native
...
Data objects
N:N Relationship
10 min
relação muitos 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 nas relações muitos para muitos essas relações são comuns em aplicações que contêm conteúdo autoral, como blogs e feeds de notícias, porque autores e tags de categoria podem ser intercambiáveis e otimizados para consultas rápidas 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 muitos para muitos no parse a primeira usa as parse object parse object relações, que é a mais rápida em tempo de criação e consulta a segunda é usando arrays, que podem levar a tempos de consulta lentos dependendo do seu tamanho por causa desse problema de desempenho, usaremos apenas exemplos de relações 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 muitos para muitos usando seu back4app e react native a qualquer momento, você pode acessar este projeto através de nossos repositórios no 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 ao 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 para realizar e demonstrar relações de banco de dados muitos para muitos no react native usando parse em um cenário realista 1 entendendo a classe livro como neste guia estaremos usando um exemplo de aplicação de registro de livros, 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, que armazenará cada entrada de livro no registro 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 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 }; todolist tsx 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 os bookauthorsobjects bookauthorsobjects estão configurados para o novo livro parse object parse object para criar uma relação muitos para muitos, você primeiro precisa criar um novo parse object relation parse object relation e então adicionar os objetos relacionados a ele, um por um ou passando um array de parse object parse object usando o parse object relation add parse object relation add método o parse criará uma coluna de tipo de relação e também uma tabela relacional no seu banco de dados o parse também criará um link para fácil acesso a esta nova tabela na coluna de campo no painel esteja ciente de que você também pode gerenciar objetos e adicionar novos à sua relação através do painel uma vez que ele é criado, então lembre se deste atalho ao desenvolver seu aplicativo 3 consultando relações muitos para muitos a recuperação de resultados de consultas de objetos relacionados muitos para muitos requer alguns passos adicionais em comparação com as consultas regulares 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 }; todolist tsx 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 autor específico, você 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 não armazenará parse object parse object instâncias de campos relacionais muitos para muitos, apenas uma referência ao nome da classe relacionada, como {" type" "relation", "classname" "author"} {" type" "relation", "classname" "author"} para recuperar e mostrar dados dessas instâncias de objeto, você precisa criar uma relação e consultá la novamente, armazenando os resultados em um array de objetos próprio depois disso, você pode iterar sobre o array de objetos e usar o parse object get parse object get método para recuperar o nome do autor aqui está como a tela da lista se parece ao usar esses procedimentos conclusão no final deste guia, você aprendeu como criar e consultar relações muitos para muitos no parse no react native no próximo guia, mostraremos como fazer consultas e relações um para um