Beste medetweakers,
Ik probeer in CakePHP een formulier te maken dat zijn data naar 3 verschillende tabellen met many to many relaties in een MySQL database, en hasAndBelongsToMany relaties in de CakePHP modellen opslaat.
Hoe ik dit ook probeer, hij slaat alleen de data op van de controller waar ik in zit, of ik krijg de volgende MySQL error:
Dit is het formulier in mijn View/Weekschedules/jeffrey.ctp (wordt nog hernoemd zodra ik de boel aan de praat heb gekregen):
Wanneer ik de formulier inputs op deze manier neerzet geeft hij bovenstaande MySQL error, wanneer ik de inputs die niet in de controller zitten plaats als Period.0.name slaat hij alleen de Weekschedule data op.
Dit is hoe de jeffrey actie in Controller/WeekschedulesController.php er op dit moment uit ziet, het Weekschedule id staat hier alleen even als test, want ik wil ook de Weekschedule via dit formulier aanmaken. Ik heb in plaats van de save() functie ook al saveAll() en saveAssociated() geprobeerd, en 'deep' => true meegeven werkt ook niet.
Mijn Weekschedule model is standaard CakePHP bake code:
Regeltje in routes.php:
Zo zien de gerelateerde databasetabellen er uit:
Er is een periods tabel met de volgende kolommen:
id (INT)
name (VARCHAR(45))
description (TEXT)
startdatetime (DATETIME)
enddatetime (DATETIME)
created (DATETIME)
modified (DATETIME)
Dan is er een periods_weekschedules join tabel met de volgende kolommen:
period_id (INT)
weekschedule_id (INT)
En de volgende foreign keys:
fk_periods_has_weekschedules_periods1: periods_weekschedules.period_id -> periods.id
fk_periods_has_weekschedules_weekschedules1: periods_weekschedules.weekschedule_id -> weekschedules.id
Dan is er een weekschedules tabel met de volgende kolommen:
id (INT)
name (VARCHAR(45))
orderNr (INT)
oddeven (VARCHAR(45))
created (DATETIME)
modified (DATETIME)
Dan is er een timetables_weekschedules join tabel met de volgende kolommen:
weekschedule_id (INT)
timetable_id (INT)
En de volgende foreign keys:
fk_weekschedules_has_timetables_weekschedules1: timetables_weekschedules.weekschedule_id -> weekschedules.id
fk_weekschedules_has_timetables_timetables1: timetables_weekschedules.timetable_id -> timetables.id
En dan is er nog een timetables tabel met de volgende kolommen:
id (INT)
weekday (INT)
starttime (TIME)
endtime (TIME)
created (DATETIME)
modified (DATETIME)
Ik hoop dat dit voldoende informatie is voor jullie, en anders hoor ik het uiteraard graag. Alvast bedankt!
Jeffrey
Edit:
Probleem is opgelost, puntje 3 op deze pagina deed het hem: http://patisserie.keensof...ave-habtm-data-in-cakephp
Ik probeer in CakePHP een formulier te maken dat zijn data naar 3 verschillende tabellen met many to many relaties in een MySQL database, en hasAndBelongsToMany relaties in de CakePHP modellen opslaat.
Hoe ik dit ook probeer, hij slaat alleen de data op van de controller waar ik in zit, of ik krijg de volgende MySQL error:
code:
1
| Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`agenda`.`timetables_weekschedules`, CONSTRAINT `fk_weekschedules_has_timetables_timetables1` FOREIGN KEY (`timetable_id`) REFERENCES `timetables` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTIO) |
Dit is het formulier in mijn View/Weekschedules/jeffrey.ctp (wordt nog hernoemd zodra ik de boel aan de praat heb gekregen):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <div class="form"> <?php echo $this->Form->create('Weekschedule'); ?> <fieldset> <legend><?php echo __('Create workschedule'); ?></legend> <?php echo "<h1>Period</h1>"; echo $this->Form->input('Period.name'); echo $this->Form->input('Period.description'); echo $this->Form->input('Period.startdatetime'); echo $this->Form->input('Period.enddatetime'); echo "<h1>Weekschedule</h1>"; echo $this->Form->input('Weekschedule.name'); echo $this->Form->input('Weekschedule.oddeven'); echo "<h1>Timetable</h1>"; echo $this->Form->input('Timetable.weekday'); echo $this->Form->input('Timetable.starttime'); echo $this->Form->input('Timetable.endtime'); ?> </fieldset> <?php echo $this->Form->end(__('Submit')); ?> </div> |
Wanneer ik de formulier inputs op deze manier neerzet geeft hij bovenstaande MySQL error, wanneer ik de inputs die niet in de controller zitten plaats als Period.0.name slaat hij alleen de Weekschedule data op.
Dit is hoe de jeffrey actie in Controller/WeekschedulesController.php er op dit moment uit ziet, het Weekschedule id staat hier alleen even als test, want ik wil ook de Weekschedule via dit formulier aanmaken. Ik heb in plaats van de save() functie ook al saveAll() en saveAssociated() geprobeerd, en 'deep' => true meegeven werkt ook niet.
PHP:
1
2
3
4
5
6
7
8
9
10
| public function jeffrey() { $this->Weekschedule->recursive = 2; $this->request->data['Weekschedule']['id'] = 95; debug($this->request->data); if (!empty($this->request->data)) { $this->Weekschedule->save($this->request->data); } } |
Mijn Weekschedule model is standaard CakePHP bake code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| <?php App::uses('AppModel', 'Model'); /** * Weekschedule Model * * @property Period $Period * @property Timetable $Timetable */ class Weekschedule extends AppModel { /** * Display field * * @var string */ public $displayField = 'name'; //The Associations below have been created with all possible keys, those that are not needed can be removed /** * hasAndBelongsToMany associations * * @var array */ public $hasAndBelongsToMany = array( 'Period' => array( 'className' => 'Period', 'joinTable' => 'periods_weekschedules', 'foreignKey' => 'weekschedule_id', 'associationForeignKey' => 'period_id', 'unique' => 'keepExisting', 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'finderQuery' => '', ), 'Timetable' => array( 'className' => 'Timetable', 'joinTable' => 'timetables_weekschedules', 'foreignKey' => 'weekschedule_id', 'associationForeignKey' => 'timetable_id', 'unique' => 'keepExisting', 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'finderQuery' => '', ) ); } |
Regeltje in routes.php:
PHP:
1
2
| // Jeffrey's test page Router::connect('/jeffrey', array('controller' => 'weekschedules', 'action' => 'jeffrey')); |
Zo zien de gerelateerde databasetabellen er uit:
Er is een periods tabel met de volgende kolommen:
id (INT)
name (VARCHAR(45))
description (TEXT)
startdatetime (DATETIME)
enddatetime (DATETIME)
created (DATETIME)
modified (DATETIME)
Dan is er een periods_weekschedules join tabel met de volgende kolommen:
period_id (INT)
weekschedule_id (INT)
En de volgende foreign keys:
fk_periods_has_weekschedules_periods1: periods_weekschedules.period_id -> periods.id
fk_periods_has_weekschedules_weekschedules1: periods_weekschedules.weekschedule_id -> weekschedules.id
Dan is er een weekschedules tabel met de volgende kolommen:
id (INT)
name (VARCHAR(45))
orderNr (INT)
oddeven (VARCHAR(45))
created (DATETIME)
modified (DATETIME)
Dan is er een timetables_weekschedules join tabel met de volgende kolommen:
weekschedule_id (INT)
timetable_id (INT)
En de volgende foreign keys:
fk_weekschedules_has_timetables_weekschedules1: timetables_weekschedules.weekschedule_id -> weekschedules.id
fk_weekschedules_has_timetables_timetables1: timetables_weekschedules.timetable_id -> timetables.id
En dan is er nog een timetables tabel met de volgende kolommen:
id (INT)
weekday (INT)
starttime (TIME)
endtime (TIME)
created (DATETIME)
modified (DATETIME)
Ik hoop dat dit voldoende informatie is voor jullie, en anders hoor ik het uiteraard graag. Alvast bedankt!
Jeffrey
Edit:
Probleem is opgelost, puntje 3 op deze pagina deed het hem: http://patisserie.keensof...ave-habtm-data-in-cakephp
[ Voor 1% gewijzigd door broadbeanprop op 15-12-2014 10:14 . Reden: Probleem opgelost ]