Empfehlungen: Erweiterte Suche

Model A speichern bevor Model B gespeichert wird

Datenbankobjekte strukturieren und validieren

Model A speichern bevor Model B gespeichert wird

Beitragvon klaus » Do 16. Jul 2009, 17:02

Hallo,

ich habe ein kleines Verständnisproblem mit dem Speichern von Objekten.
Ich arbeite gerade eines der schönen Tutorial von james fairhurst durch - sehr empfehlenswert für Einsteiger - und würde das gern abwandeln.
Es geht darum ein Model und ein assoziiertes Model gleichzeitig anzulegen.
Also ich möchte einen Post und gleichzeitig ein oder mehrere Tags zum Post anlegen.
Post und Tags sollen neu erstellt werden, falls noch nicht vorhanden und natürlich sollen sollen die Tags auch dem Post zugeordnet sein.
Weiß jemand wies gehen könnte?
Vielen Dank schon mal.
Klaus
klaus
 
Beiträge: 8
Registriert: Do 16. Jul 2009, 16:44

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon dth33 » Do 16. Jul 2009, 18:30

Hallo Klaus,

dafür nimmst Du saveAll($data, $options).

Damit kannst Du Daten aus mehreren Models gleichzeitig abspeichern.

$this->Model->saveAll($data);

Gruß Steffen
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon klaus » Do 16. Jul 2009, 20:01

Hm hab ich probiert, der Post wird angelegt, aber der Tag nicht.
Im Controller siehts so aus:
Code: Alles auswählen
if($this->Post->saveAll($this->data)) {

Es gibt keine Valierdierungsregeln für Tags oder Posts.
In der Form hab ich folgendes eingefügt:
Code: Alles auswählen
echo $form->input('Tag.tag');
Firebug gibt mir das mit data[Tag][tag] aus. Woran könnts liegen?
klaus
 
Beiträge: 8
Registriert: Do 16. Jul 2009, 16:44

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon dth33 » Do 16. Jul 2009, 20:13

probier doch mal ein

<?php debug ($this->data); ?>


Schau dir mal das Ergebnis an. Wenn Du mehrere Tags hast, würde ich darauf tippen, dass folgendes funktioniert:

echo $form->input('Tag.0.tag');
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon klaus » Do 16. Jul 2009, 21:10

Ich habs erst mal nur mit einem Tag versucht.
Das Ergebnis vom debuggen sieht so aus:
Code: Alles auswählen
(
    [Post] => Array        (
            [user_id] => 3
            [title] => asdfasdfasdf
            [body] => asdfasdf
            [slug] => asdfasdfasdf
        )
    [Tag] => Array        (
            [tag] => asdfasdfasdf
        )
)


Müsste doch eigentlich funktionieren.
Vielleicht noch zur Info, falls das von Belang ist --> cake_1.2.3.8166 wird genutzt.
klaus
 
Beiträge: 8
Registriert: Do 16. Jul 2009, 16:44

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon aioon » Fr 17. Jul 2009, 15:42

Dieses Thema interessiert mich auch!

Wie wird eigentlich die ID des soeben eingetragenen Posts an das andere Zeug übergeben? Außerdem woher weiss es, was zuerst gespeichert werden muss?

Muss da nicht eine bestimmte Beziehung (relation) in den Models vorhanden sein?
Zuletzt geändert von aioon am Fr 17. Jul 2009, 19:24, insgesamt 1-mal geändert.
aioon
 
Beiträge: 39
Registriert: So 12. Jul 2009, 18:14

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon dth33 » Fr 17. Jul 2009, 19:20

Also folgendes Beispiel könnt ihr mal probieren:

Model Post
------------

<?php

class Post extends AppModel {

var $name = 'Post';

var $hasMany = array(
'Tag' => array(
'className' => 'Tag',
'foreignKey' => 'post_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);

?>



Model Tag
-----------

<?php
class Tag extends AppModel {

var $name = 'Tag';

var $belongsTo = array(
'Post' => array(
'className' => 'Post',
'foreignKey' => 'post_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);

?>

Dann in Controller Posts
-------------------------

function add() {
if (!empty($this->data)) {
$this->Post->create();
if ($this->Post->saveAll($this->data, array('validate' => 'first'))) {
$this->flashSuccess('Gespeichert', 'index');
} else {
$this->flashWarning('Konnte nicht gespeichert werden.');
}
}
}




Der Form Input wäre dann wie von mir oben beschrieben.

Gruß
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon aioon » Fr 17. Jul 2009, 19:45

da meine Frage auch um selbes Thema handelt, möchte ich al hier gleich was Fragen 8-)

Ich habe 2 Tabellen (requests {id, subject, etc}, messages {id, request_id, message})

Jetzt möchte ich einen Request speichern, und zu diesem auch die Message gleich!

so sieht dann das Formular aus:
Code: Alles auswählen
Request [Test eintrag...] (subject)

Message [dies ist ein blindtext etc...] (message)

                     Speichern

Wie genau muss das View nun aufgebaut werden? Weil momentan sieht es so aus:
Code: Alles auswählen
<div class="requests form">
<?php echo $form->create('Request');?>
    <fieldset>
        <legend><?php __('Add Request');?></legend>
    <?php
        echo $form->input('client_id');
        echo $form->input('status_id');
        echo $form->input('priority_id');
        echo $form->input('employee_id');
        echo $form->input('request_type_id');
        echo $form->input('subject');
    ?>
    </fieldset>
<?php echo $form->end('Submit');?>
</div>

reicht es einfach wenn ich dazuschreibe?
Code: Alles auswählen
echo $form->input('message');

Aber irgendwie muss man es doch kennzeichen oder nicht, zu welchem Model was gehört?

Gruß
Alex
aioon
 
Beiträge: 39
Registriert: So 12. Jul 2009, 18:14

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon aioon » Fr 17. Jul 2009, 21:29

Code: Alles auswählen
<div class="requests form">
<?php echo $form->create('Request');?>
    <fieldset>
        <legend><?php __('Add Request');?></legend>
    <?php
        echo $form->input('client_id');
        echo $form->input('status_id');
        echo $form->input('priority_id');
        echo $form->input('employee_id');
        echo $form->input('request_type_id');  
        echo $form->input('subject');
        echo $form->input('Message.message');      
    ?>
    </fieldset>
<?php echo $form->end('Submit');?>
</div>


die message wird nun mitgespeichert, aber die ID des voherigen wird nicht mitgegeben :(
aioon
 
Beiträge: 39
Registriert: So 12. Jul 2009, 18:14

Re: Model A speichern bevor Model B gespeichert wird

Beitragvon aioon » Fr 17. Jul 2009, 21:45

Okay, das funktioniert alles wunderbar nun!

Die ganze Magie liegt wie es aussieht im saveAll() und $form->input('Message.0.message') an dieser 0 :)

http://blog.matsimitsu.nl/code/164/saveall-with-cakephp hat mir auch geholfen

Vielen Dank dth33 8-)

Gruß
Alex
aioon
 
Beiträge: 39
Registriert: So 12. Jul 2009, 18:14

Nächste

Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast