2010-12-07 12 views
2

Spar ich folgendes haben viele durch Beziehungcakephp - hat viele durch nicht

Alert   AlertsElement  Search 
id    id     id 
name    alert_id   link 
        search_id 
        ordering 

Hier sind meine Modelle

class Alert extends AppModel { 
var $name = 'Alert'; 
var $hasMany = array('AlertsElement'); 

class AlertsElement extends AppModel { 
var $name = 'AlertsElement'; 
var $belongsTo = array('Alert','Search'); 

class Search extends AppModel { 
var $name = 'Search'; 
var $hasMany = array('AlertsElement'); 

Hier ist mein Test-Code verwende ich zu tun hat, eine speichern -

$d = array(); 
$d['Alert']['id'] = 1976; 
$d['Search']['id'] = 107; 
$d['AlertsElement']['ordering'] = 2; 
$this->Alert->create(); 
$this->Alert->saveAll($d); 

ich diesen Fehler -

Cannot use a scalar value as an array [CORE/cake/libs/model/model.php, line 1696] 

und ein Zeileneintrag in alertselement mit dem Auftrag, aber die ausländischen auf 0 gesetzt Tasten

Irgendwelche Ideen?

Danke, Alex

Antwort

9

Um eine Beziehung zu hasManysaveAll, die hasMany -assoziierten Modelldaten (in diesem Fall $d['AlertsElement']) zu speichern, muss ein indiziertes Array von assoziativer Arrays sein, also:

$d = array(
    'Alert' => array(
    'id' => 1976 
), 
    'AlertsElements' => array(
    0 => array(
     'ordering' => 2 
    ) 
) 
); 
$this->Alert->saveAll($d); 

Beachten Sie, dass das assoziative Array, bestehend aus dem Schlüssel 'ordering' und seinem Wert, nach unten in ein indiziertes Array verschoben wurde. Dies ist das erforderliche Format zum Speichern von hasMany-verknüpften Daten in einem einzelnen saveAll-Vorgang, da dieses Format elegant erweitert wird, unabhängig davon, ob Sie einen oder zehn verknüpfte Datensätze speichern möchten.

Weitere Informationen finden Sie im Kuchenhandbuch unter saving related model data.

+0

Danke für die Beantwortung meiner beiden Fragen, wo würde die Such-ID gehen? – Alex

+0

Da das 'Search'-Modell leider nicht direkt mit dem' Alert'-Modell verknüpft ist, können Sie das 'Search'-Modell nicht im selben Aufruf speichern. Dies ist nur eine Einschränkung von Cakes ORM. Sie müssen den 'Search'-Datensatz in der Post-Save-Logik oder in einem 'AfterSave'-Callback des' AlertsElement'-Modells speichern. –

+0

Danke für die Hilfe! – Alex

0

Ich habe hier nach einer Lösung für this question gesucht. Nicht zu widersprechen Daniel, das Buch sagt, dass, wenn Sie eine hasMany through Beziehung verwenden (was Alex verwendet), können Sie alle drei Datensätze mit einem einzigen saveAll Anruf speichern, aber Sie tun es aus dem Modell der beitretenden Tabelle wie folgt:

$data = array(
    [Student] => Array 
     (
      [first_name] => Joe 
      [last_name] => Bloggs 
     ) 

    [Course] => Array 
     (
      [name] => Cake 
     ) 

    [CourseMembership] => Array 
     (
      [days_attended] => 5 
      [grade] => A 
     ) 

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

Wenn ich das Buch falsch verstanden habe, sollte das Beispiel erstellen die Schüler, Kurs, und Verbinden CourseMembership Aufzeichnungen. Das heißt, ich muss es noch wie dokumentiert arbeiten lassen. Ich gebe eine ID für den Kurs ein, da ich einen vorhandenen Kurs verwende, aber er erstellt weder den Student- noch den CourseMembership-Datensatz.

Noch mehr Feedback geschätzt.

Verwandte Themen