Hallo allerseits Ich arbeite derzeit an einem Formular, das Zeilen aus einer verwandten Tabelle enthält und Verarbeitung des Formulars hat eine präsentiert Herausforderung: Was ist in F3 die beste Methode, um ein Formular zu bearbeiten, das dazu führen kann, dass Zeilen in einer verknüpften Tabelle hinzugefügt, geändert oder gelöscht werden?Fat-Free-Framework: Hinzufügen/Ändern/Löschen von Datensätzen verwandter Tabelle mit DB SQL Mapper
DB Schema
practitioner
------------------------------
id | int(10)
first_name | varchar(255)
last_name | varchar(255)
abn | char(11)
mobile | varchar(20)
email | varchar(255)
practice_site
------------------------------
id | int(10)
name | varchar(255)
provider_number
------------------------------
id | int(10)
practice_site_id | int(10)
practitioner_id | int(10)
provider_number | varchar(20)
Das Form
- Provider Nummern dynamisch hinzugefügt werden, Formularnamen sind mit
_n
geändert, z.B.provider_number_3
- Die Schaltfläche Löschen entfernt die insgesamt Reihe, dort Sinn
provider_number_1
sein kann undprovider_number_3
aber keineprovider_number_2
Formularausgabe
Die Provider Zahlen in etwas ein bisschen umgewandelt werden überschaubarer als *_n
.
Andere Felder, id
, first_name
, usw. werden dank copyfrom()
leicht aktualisiert.
Array
(
[id] => 1
[first_name] => Jon
[last_name] => Doctor
[abn] => 12345678902
[mobile] => 0491729472
[email] => [email protected]
[provider_numbers] => Array
(
[0] => Array
(
[provider_number] => ASBDF24
[practice_site_id] => 2
)
[1] => Array
(
[provider_number] => 1249FBK
[practice_site_id] => 2
)
)
)
Das Problem
Einige Bedingungen über Providernummern können auftreten, wenn das Formular abgeschickt wird:
- Eine neue Anbieter Nummer
- Ein Anbieter Nummer hinzugefügt wird, geändert
- Eine Übungsstelle wurde geändert
- Ein Anbieter Nummer
entfernt Wie der beste Weg, um dies zu realisieren wäre? (Vorzugsweise mit der Klasse DB\SQL\Mapper
von Fat-Free-Framework).
Mögliche Lösung:
- ein
$db->exec()
Sie eine Reihe von bestehendenprovider_number
Tisch zu bekommen, woprovider_id = POST.id
- ein
array_diff()
Führen Sie alle Einträge in der Datenbank zu finden, die nicht in Form ist dann eine Aussage überDELETE
diese Aufzeichnungen. Truncate das ursprüngliche Array. - Traverse durch Array suchen, ob die s übereinstimmen. Wenn sie es tun, aber
practice_site_id
ist anders, aktualisieren. Wennpractice_site_id
gleich ist, nichts tun. - Wie kann man genau bestimmen, ob sich eine
provider_number
für eine bestimmtepractice_site_id
geändert hat?
Eine andere Möglichkeit:
- Ändern der Form
provider_number.id
aufzunehmen, wenn eine neue Zeile hinzugefügt wird, die neueste verfügbare ID aus der von @ xfra35
Ihr letzter Vorschlag sieht wie die einfachste Lösung aus (include 'provider_number.id'). Auf diese Weise brauchen Sie nur '$ providerNumber-> load (['id =?', $ Id])' und der Mapper wird automatisch eingefügt oder aktualisiert, je nachdem ob die ID mit einem existierenden Datensatz übereinstimmt oder nicht. Sie müssen auch gelöschte Datensätze verfolgen. Dies könnte mit einem zusätzlichen versteckten booleschen Löschfeld erreicht werden. – xfra35