Реализация связи многие-ко-многим на Flutter с Parse
11 мин
многие ко многим отношения на flutter введение в предыдущем руководстве мы узнали, как использовать отношения один ко многим, и мы продолжим наш проект в этом руководстве мы сосредоточимся на самом распространенном отношении многие ко многим существует три способа создания отношения многие ко многим в parse первый способ — использовать parse \<font color="#2166ae">отношения\</font> , что является самым быстрым способом создания и выполнения запросов мы будем использовать это в этом руководстве второй способ — использовать \<font color="#2166ae">массивы\</font> \<font color="#2166ae">указатели\</font> которые могут привести к медленным временам выполнения запросов в зависимости от их размера третий способ — использовать \<font color="#2166ae">jointable\</font> где идея взята из классической базы данных когда существует отношение многие ко многим, мы объединяем каждый \<font color="#2166ae">objectid\</font> или \<font color="#2166ae">указатель\</font> с обеих сторон вместе, чтобы создать новую отдельную таблицу, в которой отслеживается отношение в этом руководстве вы реализуете \<font color="#2166ae">отношение многие ко многим\</font> в приложении регистрации книг на flutter, используя parse \<font color="#2166ae">отношения\</font> вы узнаете, как создавать и выполнять запросы к данным с отношениями многие ко многим и как выполнять запросы, возвращающие данные из связанных объектов, используя back4app и flutter sdk предварительные требования android studio https //developer android com/studio или vs code установлен https //code visualstudio com/ (с плагинами https //docs flutter dev/get started/editor dart и flutter) примечание приложение flutter, созданное в предыдущем руководстве завершите предыдущее руководство, чтобы лучше понять \<font color="#2166ae">отношение один ко многим\</font> класса устройство (или виртуальное устройство), работающее на android или ios 1 запустите шаблон приложения book если вы не завершили предыдущее руководство, вы можете клонировать и запустить полный book flutter app https //github com/templates back4app/flutter associations проект из нашего репозитория вы также можете ознакомиться с предыдущим руководством https //www back4app com/docs/flutter/parse sdk/data objects/%7bsite baseurl%7d%7d//flutter/parse sdk/data objects/flutter one to many relationship для лучшего понимания шаблона приложения ниже вы можете найти визуальное представление модели данных регистрации книг 2 сохраните объект книги и его автора откройте проект flutter из предыдущего руководства отношение один ко многим в flutter https //www back4app com/docs//flutter/parse sdk/data objects/flutter one to many relationship найдите функцию \<font color="#2166ae">dosavebook\</font> в файле \<font color="#2166ae">main dart\</font> , и замените ее кодом ниже внутри функции \<font color="#2166ae">future\<void\> dosavebook()\</font> эта функция создаст новую книгу в хранилище данных back4app с отношениями 1 final book = parseobject('book') 2 set('title', controllertitle text trim()) 3 set('year', int parse(controlleryear text trim())) 4 //the objectid will be converted to a pointer on the save() method 5 set('genre', parseobject('genre') objectid = genre objectid) 6 //you can also convert to a pointer object before the saving using the topointer() method 7 set('publisher', 8 (parseobject('publisher') objectid = publisher objectid) topointer()) 9 //saving a list of authors for the book 10 addrelation( 11 'authors', 12 authors 13 map((o) => parseobject('author') objectid = o objectid) 14 tolist()); 15 16 await book save(); чтобы создать эту функцию, выполните следующие шаги 1\ создайте новый экземпляр класса parse \<font color="#2166ae">книга\</font> с помощью команды \<font color="#2166ae">parseobject('книга')\</font> 2 используйте \<font color="#2166ae">установить\</font> функцию, чтобы установить поля для этого объекта 2 1 \<font color="#2166ae">название\</font> это текстовые атрибуты, которые получают значение от текстового контроллера 2 2 \<font color="#2166ae">жанр\</font> получает значение, определяя \<font color="#2166ae">parseobject\</font> с \<font color="#2166ae">objectid\</font> выбранного \<font color="#2166ae">жанр\</font> ( parse будет конвертировать в указатель при сохранении ) 2 3 \<font color="#2166ae">издатель\</font> получает значение, определяя \<font color="#2166ae">parseobject\</font> с \<font color="#2166ae">objectid\</font> выбранного \<font color="#2166ae">издателя\</font> ( обратите внимание, что мы можем указать для parse, что хотим сохранить как \<font color="#2166ae">указатель\</font> с помощью \<font color="#2166ae">topointer()\</font> метода ) 2 4 \<font color="#2166ae">авторы\</font> мы называем \<font color="#2166ae">addrelation\</font> метод \<font color="#2166ae">parseobject\</font> , отправляя список \<font color="#2166ae">parseobject\</font> с \<font color="#2166ae">objectid\</font> выбранных \<font color="#2166ae">авторов\</font> 3 вызовите \<font color="#2166ae">сохранить\</font> функцию в \<font color="#2166ae">parseobject\</font> , которая эффективно зарегистрирует объект в вашей базе данных на панели управления back4app запустите приложение и протестируйте новую \<font color="#2166ae">dosavebook()\</font> функцию сначала зайдите на панель управления и удалите книги, которые были ранее зарегистрированы в предыдущем руководстве нажмите на \<font color="#2166ae">добавить книгу\</font> кнопку заполните информацию о книге с авторами нажмите на \<font color="#2166ae">сохранить книгу\</font> кнопку чтобы подтвердить, что новый объект сохранен в базе данных с отношениями, вы можете получить доступ к \<font color="#2166ae">back4app dashboard\</font> и получить доступ к \<font color="#2166ae">book\</font> классу нажатие на указатель объекта/значение отношения на вашей панели управления перенаправит вас на запись ссылочного объекта это может показаться безобидной функцией, но это значительно ускоряет отладку и отслеживание ошибок по сравнению с ручным поиском 3 запросить детали книги с отношениями эта функция будет запрашивать детали книги в базе данных back4app, возвращая данные о связях в некоторых ситуациях вы хотите вернуть несколько типов связанных объектов в одном запросе вы можете сделать это с помощью \<font color="#2166ae">includeobject\</font> метода в нашем примере мы хотим вернуть книги с информацией из жанра и издателей ищите функцию \<font color="#2166ae">getbookdetail\</font> в файле \<font color="#2166ae">main dart\</font> , затем замените код ниже внутри \<font color="#2166ae">getbookdetail(parseobject book)\</font> функции 1 querybuilder\<parseobject> querybook = 2 querybuilder\<parseobject>(parseobject('book')) 3 whereequalto('objectid', book objectid) 4 includeobject(\['publisher', 'genre']); 5 6 final parseresponse responsebook = await querybook query(); 7 8 if (responsebook success && responsebook results != null) { 9 final book = (responsebook results first) as parseobject; 10 booktitle = book get\<string>('title'); 11 bookyear = book get\<int>('year'); 12 bookgenre = book get\<parseobject>('genre') get\<string>('name'); 13 bookpublisher = book get\<parseobject>('publisher') get\<string>('name'); 14 loadeddata = true; 15 } 16 17 querybuilder\<parseobject> queryauthors = 18 querybuilder\<parseobject>(parseobject('author')) 19 whererelatedto('authors', 'book', book objectid); 20 21 final parseresponse responseauthors = await queryauthors query(); 22 23 if (responseauthors success && responseauthors results != null) { 24 bookauthors = responseauthors results 25 map((e) => (e as parseobject) get\<string>('name')) 26 tolist(); 27 } чтобы создать эту функцию, выполните следующие шаги создайте экземпляр \<font color="#2166ae">parsequery\</font> объекта для \<font color="#2166ae">книга\</font> класса вставьте условие в запрос, чтобы искать \<font color="#2166ae">книги\</font> где \<font color="#2166ae">objectid\</font> поле равно \<font color="#2166ae">objectid\</font> выбранной книги мы используем метод includeobject, указывая поля указателей, данные которых мы хотим вернуть в том же запросе жанр и издатель вы также можете делать многоуровневый includeobject, используя точечную нотацию пример ` includeobject(\[‘post’, ‘post authors’]); выполните метод поиска запроса, используя \<font color="#2166ae">query()\</font> метод если операции успешны, объект в \<font color="#2166ae">книга\</font> будет возвращен мы используем метод get для получения данных для полей, которые являются указателями, нам сначала нужно получить указатель, а затем получить его данные пример \<font color="#2166ae">bookgenre = book get\<parseobject\>('genre') get\<string\>('name');\</font> на втором этапе обработки нам нужно восстановить авторов, связанных с книгой чтобы создать эту функцию, выполните следующие шаги создайте экземпляр \<font color="#2166ae">parsequery\</font> объекта для класса \<font color="#2166ae">authors\</font> вставьте условие в запрос, используя \<font color="#2166ae">whererelatedto\</font> оператор для поиска \<font color="#2166ae">authors\</font> связи с \<font color="#2166ae">book\</font> , где \<font color="#2166ae">book\</font> равен \<font color="#2166ae">objectid\</font> выбранной книги выполните метод поиска запроса, используя \<font color="#2166ae">query()\</font> метод если операции успешны, объект в \<font color="#2166ae">book\</font> будет возвращен мы используем метод get для получения данных запустите приложение и протестируйте новый запрос сначала нажмите на кнопку \<font color="#2166ae">список издателей/книг\</font> выберите книгу из списка на следующем экране будут отображены данные о книгах и их отношениях готово! на этом этапе вы узнали, как создавать и запрашивать отношения многие ко многим и как выполнять запросы, возвращающие данные из связанных объектов в parse на \<font color="#2166ae">flutter\</font>