Toon posts:

[PHP] Update van koppeltabel event -> classes

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hallo,

Ik zit met een klein probleempje en dat is het volgende:

In de database heb ik een tabel met de evenementen, hierin staan de rijen, id/title/date en de status van het evenement.

code:
1
2
3
4
5
6
INSERT INTO `event` (`id`, `title`, `date`, `status`) VALUES
(5, 'Foo', '2012-09-24 08:42:13', '1'),
(6, 'Test', '2012-09-25 09:23:05', '1'),
(7, 'Bar', '2012-11-24 23:00:00', '1'),
(8, 'Evenement Q4 2013', '2013-11-28 23:00:00', '1'),
(9, 'Evenement Q4 2012', '2012-11-24 23:00:00', '1');


Bij de inschrijving van een evenement is het mogelijk om te kiezen uit verschillende klasses. Welke klasses bij een evenement horen wordt bij gehouden in de tabel 'koppel':

code:
1
2
3
4
5
6
7
8
INSERT INTO `koppel` (`id`, `event_id`, `classes_id`) VALUES
(18, 5, 3),
(19, 5, 4),
(20, 6, 2),
(21, 6, 3),
(22, 7, 2),
(23, 7, 3),
(24, 7, 7),


Zoals je kan zien, bij event_id 5 hoort ook classes_id 3 en 4 (en 6 bij 2/3, 7 bij 2/37).

Echter zit mijn probleem bij, als je een evenement aanpast (de klasses), hoe kan je dan simpel controleren als het record al bestaat in de database (1) en/of niet bestaat, dan moet hij toegevoegd worden (2) en anders moet hij verwijderen worden (3).

Ik kan natuurlijk alle records van het event_id eerst verwijderen om ze vervolgens weer in de tabel koppel te zetten, maar dat is een niet erg 'nette' manier 8)7 .

Ik had zelf al geprutst om de om de koppel_ids eerst op te halen en dan te controleren met in_array, maar dat werkt niet.

Groeten,
Bammurt

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik werk meestal met array_diff() op zo'n moment. Je weet van je huidige record de mapping van klassen en je weet wat je net hebt binnengekregen aan nieuwe klassen.

Een voorbeeldje:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$classes = $event->getClasses();
$listOld = array();

foreach ($classes as $class) {
  $listOld[] = $class->getId();
}

// Bedenk dat $data je POST is met daarin ook alle klasses weer opnieuw
$listNew = array()
foreach ($myData['classes'] as $class) {
  $listNew[] = $class['id'];
}

// Nu het verschil bekijken
$delete = array_diff($listOld, $listNew);
$add    = array_diff($listNew, $listOld);

// Zeg $service is een klasse die je data mapper kan aanspreken
$service->deleteClassesFromEventWithId($event, $delete);

$service->addClassesToEventWithId($event, $add);
Dan is $listOld een lijst van ids van klassen die op dat moment in je database staan en $listNew een lijst van ids van klassen die je net allemaal hebt gestuurd. Het verschil is een reeks die je moet verwijderen ($delete) en een reeks die je moet toevoegen ($add). Alle ids die gelijk zijn in $listOld en in $listNew blijven dan ongewijzigd.

Verwijderd

Topicstarter
Mithras, bedankt voor je snelle antwoord!, Ik had even niet gedacht aan de mogelijkheden van array_diff.

Het is inmiddels gelukt, met dank aan je mooie voorbeeld (Y). Top!.