Сохраняйте данные на двух разных ресурсах

Я пытаюсь сохранить полную запись пользователя, но я использую две отдельные таблицы. Данные профиля сохраняются на одном ресурсе, а адрес - на другом. Как я могу написать код, чтобы он сначала сохранял профиль, а из сгенерированного идентификатора сохранял адрес? Возможно?

Форма профиля

Адресная форма

Вот мой код создания пользователя:

export const BarberCreate = (props) => {
  return (
    <Create {...props}>
      <TabbedForm toolbar={<BarberCreateToolbar />}>
        <FormTab label="Perfil">
          <TextInput source="name" />
          <TextInput source="email" />
          <DateInput source="birthday" />
          <TextInput source="phone" placeholder="(99) 99999-9999" />
          <TextInput source="transport" />
        </FormTab>

        <FormTab label="Endereço">
          <TextInput source="street" label="Rua" />
          <TextInput source="city" label="Cidade" />
          <TextInput source="district" label="Bairro" />
        </FormTab>
      </TabbedForm>
    </Create>
  );
};```

person Marlon Saldanha    schedule 07.05.2020    source источник
comment
что ты уже испробовал?   -  person MonteCristo    schedule 08.05.2020
comment
Я уже пробовал переписать методы отправки классов. Но это очень сложно и мне мало что известно. Самый быстрый способ, который я себе придумал, выглядит примерно так: 1º Заполните все поля (Профиль и Адрес). 2. Зарегистрируйте данные профиля. 3-й. Из идентификатора, сгенерированного в профиле, зарегистрируйте адрес.   -  person Marlon Saldanha    schedule 08.05.2020


Ответы (1)


Лучше всего сделать это на бэкэнде, возможно, с поддержкой транзакций, но если вы не можете, один из способов перейти на сторону реагирования-администратора - это украсить dataProvider.

v3

const userSaverDataProvider = dataProvider => ({
    ...dataProvider,
    create: async (resource, params) => {

        if (resource === 'users') {

            const profile = await dataProvider.create('profile', {data: {
                name: params.data.name,
                ....
            }})

            await dataProvider.create('address', {data: {
                profileID: profile.data.id,
                street: params.data.street,
                ...
            }})

            return profile        

        }        

        return dataProvider.create(resource, params)
    }
})

Возможно, необходимо также украсить createMany, если вы делаете массовое создание пользователей в react-admin. Также проверьте https://github.com/FusionWorks/react-admin-google-maps, это может быть полезно

person gstvg    schedule 09.05.2020
comment
Ты прав. В данном случае это лучший способ. Однако я решил вложить адрес в профиль из-за сроков. В любом случае спасибо за помощь :) - person Marlon Saldanha; 17.05.2020