molily: Mehrere Lösungswege eines Threads zulassen

Beitrag lesen

Hallo,

Sprich ein User geht in sein Profil bearbeitet seine Sprachen, klickt auf speichern, was passiert dann? Lösche ich erst ALLE Datensätze von diesem User und schreibe alle neu, was wohl die einfachste Möglichkeit ist oder prüfe ich, welcher Datensatz neu bzw. weg gefallen sind?

Letzteres.

Du hast zwei Arrays:
1. Die aktivierten Sprachen aus dem Formular
2. Die existierenden Sprachen, für die Einträge in der Join-Tabelle bestehen

Zu 1.:

<form>  
<input type="hidden" name="languages[]" value="">  
<ul>  
<li>  
<label><input type="checkbox" name="languages[]" value="1"> Deutsch</label>  
</li>  
<li>  
<label><input type="checkbox" name="languages[]" value="2"> Englisch</label>  
</li>  
<li>  
<label><input type="checkbox" name="languages[]" value="3"> Französisch</label>  
</li>  
</ul>  
</form>

$_POST['languages'] ist jetzt

  • ein leerer Array oder
  • ein Array mit einer oder mehreren IDs

Diesen Array nennt ich im folgenden $existing_language_ids

Zu 2.:

Die Liste der aktuellen Sprachen holst du dir aus der Join-Tabelle. Die Join-Tabelle speichert einfach zwei Foreign-Keys, einmal user_id und einmal language_id. Sie wird üblicherweise nach den beiden Entitäten benannt, die sie per n:m-Relation verbindet, also in dem Fall users_languages.

Gibt mir alle Sprachen für einen User:

SELECT * FROM users_languages WHERE user_id = X

Daraus hole ich mir alle language_ids. Diesen Array nenne ich im folgenden $new_language_ids.

Jetzt habe ich die beiden Arrays:

$existing_language_ids
$new_language_ids

Mit array_diff berechne ich, welche herausfliegen müssen.

$ids_to_delete = array_diff($existing_language_ids, $new_language_ids);

Für jeden davon führe ich aus:

DELETE FROM users_languages WHERE user_id = X AND language_id = Y

Wieder mit array_diff berechne ich, welche hinzugekommen sind:

$ids_to_insert = array_diff($new_language_ids, $existing_language_ids);

Für jeden davon führe ich aus:

INSERT INTO users_languages (user_id, language_id) VALUES (X, Y)

Das ist jetzt nur eine mögliche Vorgehensweise, die das Prinzip verdeutlichen soll. Es geht bestimmt besser und optimierter (derzeit liegt die Aktualisierungslogik im Anwendungscode, ich vermute, das wäre auch performanter in der DB möglich).

Ich habe kurz ausprobiert, was Ruby on Rails hier macht. Dort wird ähnlich gearbeitet. Rails holt sich alle Sprachen für einen User mit einem Join:

SELECT languages.* FROM languagesINNER JOINlanguages_usersONlanguages.id=languages_users.language_idWHERElanguages_users.user_id = 1

(Das Laden der Languages ist alleine zum Aktualisieren der Relationen streng genommen nicht nötig, Rails antipiziert hier auch Änderungen an den Languages und cacht sie einfach mal.)

Dann wird offenbar gedifft mit der ID-Liste aus dem Formular und es werden entsprechende DELETE- und INSERT-Statements ausgeführt.

Mathias

0 74

Mehrere Werte speichern

Martin_Online
  • php
  1. 0
    Der Martin
    1. 0
      Martin_Online
      1. 0
        Der Martin
        1. 0
          Martin_Online
          1. 0
            Der Martin
            1. 0
              Martin_Online
              1. 0
                Tom
                1. 0
                  Martin_Online
                  1. 0
                    rimi
                2. 0
                  molily
                  1. 1

                    Mehrere Lösungswege eines Threads zulassen

                    Tom
                    • zu diesem forum
                    1. 0
                      Martin_Online
                      1. 0
                        Tom
                        1. 0
                          Martin_Online
                          1. 0
                            Tom
                            1. 0
                              Martin_Online
                              1. 0
                                dedlfix
                                1. 0
                                  Tom
                                  1. 1
                                    dedlfix
                                    1. 0
                                      Tom
                              2. 0
                                Tom
                              3. 0
                                molily
                            2. 0
                              dedlfix
                              1. 0
                                Martin_Online
                                1. 0
                                  Tom
                                2. 0
                                  dedlfix
                              2. 0
                                Tom
                                1. 0
                                  dedlfix
                            3. 0

                              Neuer Ansatz

                              Martin_Online
                              1. 0
                                Martin_Online
                                1. 1
                                  Auge
                                  1. 0
                                    Martin_Online
                                    1. 0
                                      molily
                                      1. 0
                                        Martin_Online
                                        1. 0

                                          Nachtrag

                                          Martin_Online
                                          1. 0
                                            molily
                                          2. 1
                                            Christian Kruse
                                        2. 0
                                          molily
                          2. 0
                            molily
                            1. 0
                              Christian Kruse
                              1. 0

                                Lange nichts gehört

                                Matthias Apsel
                                • menschelei
                                1. 0
                                  Gunnar Bittersmann
                                  1. 0
                                    Christian Kruse
                                2. 0
                                  Christian Kruse
                                  1. 0
                                    molily
                                    1. 1
                                      Christian Kruse
                                      1. 1
                                        Christian Kruse
                                      2. 0
                                        molily
                                        1. 0
                                          Christian Kruse
                    2. 0

                      Das Streben nach einer angemessenen Lösung

                      molily
            2. 0
              Martin_Online
            3. 0
              Martin_Online
              1. 0
                Der Martin
                1. 0
                  Martin_Online
                  1. 0
                    dedlfix
                    1. 0
                      Martin_Online
                      1. 0
                        dedlfix
                        1. 0
                          Martin_Online
                          1. 0
                            dedlfix
                            1. 0
                              Martin_Online
                              1. 0
                                dedlfix
                                1. 0
                                  Martin_Online
                                2. 0
                                  molily
                                  1. 1
                                    dedlfix
                                    1. 0
                                      molily
                                      1. 0
                                        dedlfix
                                      2. 1
                                        Christian Kruse
  2. 0
    dedlfix
  3. 0
    molily
    1. 0
      Martin_Online
      1. 0
        molily
  4. 0
    Martin_Online
  5. 0
    hotti