da2k / curso-reactjs-ninja

915 stars 322 forks source link

Salvar dados em uma collection de um doc específico #561

Closed carlossoglia closed 2 years ago

carlossoglia commented 3 years ago

Olá Fernando, tudo bem?

Como expliquei na última Issue, estou desenvolvendo um projeto semelhante ao React-zzaria, porém estou com dificuldades para conseguir salvar os dados em um doc de uma collection específica. Por exemplo: se eu precisar salvar dentro da collection "orders" o endereço do "user" dentro de uma subcollection específica para "address" dos usuários como eu faria?

Desde já agradeço a atenção!

@fdaciuk

fdaciuk commented 3 years ago

Oi @carlossoglia! Cara, nesse caso eu "duplicaria" a informação. Como um order, após finalizada nunca vai ser modificada, faz sentido manter a referência do endereço no momento em que a order foi criada.

Então, ao invés de fazer referência a um endereço, eu colocaria o endereço de forma estática mesmo =)

carlossoglia commented 3 years ago

Entendo Fernando! Mas sabe qual é a situação? Deixa eu tentar te explicar melhor: tenho uma base de dados já pronta e dentro do pedido preciso salvar o endereço da casa do cliente que fez o pedido e ele pode ter que cadastrar vários endereços diferentes, por exemplo a casa da avó e a casa da mãe onde ele costuma fazer os pedidos. E dentro dessa collection "Orders" já existe o doc ou subcollection "Users" que possui essas informações de diferentes endereços e ainda pode precisar gravar a nota do usuário para este pedido, por exemplo 4 estrelinhas de 5.

Aí eu precisaria de um exemplo de uma função que pudesse gravar dentro da subcollection "User" a partir de um "id" de um pedido (Order) específico, entende?

fdaciuk commented 3 years ago

Oi @carlossoglia! Se eu entendi bem como está a estrutura do seu banco, possivelmente você não está seguindo o melhor caminho: se os seus users estão dentro de orders, sua arquitetura do banco está errada.

O ideal seria você separar: criar uma collection users e uma orders. E na collection orders, você vai salvar os pedidos.

Cada pedido tem relação 1:1 com os usuários, ou seja: um pedido só pode ser feito por um único usuário. Dois usuários não podem fazer o mesmo pedido, concorda?

Então o que você deveria estar fazendo é: na hora de criar um novo pedido, você salva os dados do pedido, e você pega os dados do usuário que criou o pedido, e salva junto desse pedido.

O endereço é um dado do usuário que deveria estar no cadastro do usuário, assim ele pode cadastrar quantos endereços quiser. No momento de criar o pedido, você só precisa pedir para o usuário selecionar o endereço onde ele quer que o pedido seja entregue, e salvar esse endereço no pedido, assim como mostrado no sistema da pizzaria =)

Dentro do pedido, você ainda pode ter essa parte da avaliação, ou deixar as avaliações separadas, e só referenciar o ID do pedido com a avaliação feita.

Deu pra entender a ideia? =)

carlossoglia commented 3 years ago

Então professor, na verdade é isso mesmo, cada user tem um order dentro de si, acho que até coloquei ao contrário no texto e peço perdão. Mas é isso mesmo dentro da collection users onde temos vários documentos de diferentes usuários com o nome do usuário, email, foto, senha e tudo mais, terá a subcollection orders em cada doc com os pedidos que cada usuário faz, aí lá tem os dados de pagamento usados em cada pedido, já que uma vez ele pagou com um cartão de crédito, outra vez pagou com débito e para cada pedido ele dará 4 ou 5 estrelas entendeu? Preciso que seja dessa forma porque já me foi dada uma estrutura que eu obrigatoriamente tenho que seguir...

Aí gostaria que me mostrasse um exemplo de uma função onde eu pudesse salvar os dados dos pedidos de um usuário na subcollection "orders" de uma collection "users".

Desde já agradeço toda a atenção e acompanhamento. ;)

Segue a estrutura em imagem para melhor alinhamento e demonstração das informações. É nesse esquema que eu tenho que montar...

estrutura-db

fdaciuk commented 3 years ago

Ah, agora acho que entendi 😂 Essa estrutura faz sentido sim, se é só o usuário que vai ver seus próprios pedidos. A ideia de criar uma collection separada para os pedidos seria se você tivesse um sistema de administração, como mostrado na react-zzaria =)

Mas para salvar dados em uma subcollection, é exatamente da mesma forma que você faria com uma collection na raiz do seu Firestore: você vai escolher a collection, selecionar o documento (pelo ID do usuário) e, à partir daí, você pode usar o .collection novamente para pegar a collection mais interna. Deu pra entender a ideia? :D

fdaciuk commented 2 years ago

Oi @carlossoglia! Vou fechar a issue, mas se você ainda tiver alguma relacionada à esse assunto, a gente reabre, ok? =)