2016-08-09 60 views
2

Ich habe ein Problem mit Phalcon Modell magische Getter und Setter. Ich möchte dieses Tutorial wie folgt aktualisieren: https://docs.phalconphp.com/en/latest/reference/models.html#storing-related-recordsphalcon 2.0.13 Set Daten mit magischen Setter zu verwandten Modell

Aber die Sache ist mein Projekt ist Multi-Modul und getrennten Modellen Ordner.

So habe ich Alias ​​verwenden für hasOne und belongsTo

$this->hasOne('user_id', '\Models\UserProfile', 'user_id', array('alias' => 'UserProfile')); 

und

$this->belongsTo('user_id', '\Models\CoreUser', 'user_id', array('alias' => 'CoreUser')); 

Was ich will ist, wie dies zu tun.

$CoreUser = new CoreUser(); 
$user = $CoreUser->findFirst(array(
     //...condition here to find the row i want to update 
    )); 

$user->assign($newUserData); 

$user->setUserProfile($newProfileData); 

$user->update(); 

Aber über diesem Code speichern nur Benutzerdaten und speichern Sie keine Profildaten überhaupt. (Haben Sie Profildaten - bestätigt)

Haben Sie also eine Idee, was der Fehler ist? Wenn du es weißt, bitte hilf mir oder gib mir einen Tipp.

+0

Ist die Methode 'setUserProfile()' gibt es auf '$ user'? Ansonsten benutze einfach '$ user-> userProfile = $ newProfileData' – Timothy

+0

Könntest du bitte auch deine Antwort mit dem Inhalt von' $ newProfileData' aktualisieren? – Timothy

+0

$ user-> userProfile = $ newProfileData oder $ user-> UserProfile = $ newProfileData funktioniert nicht .. warum ist das? es sollte funktionieren wie in vokuro beispiel :( – Zoedia

Antwort

0

Statt tun

$profile = $user->UserProfile; 

Sie sollten ein neues UserProfile Objekt instanziiert

// find your existing user and assign updated data 
$user = CoreUser::findFirst(array('your-conditions')); 
$user->assign($newUserData); 

// instantiate a new profile and assign its data 
$profile = new UserProfile(); 
$profile->assign($newProfileData); 

// assign profile object to your user 
$user->UserProfile = $profile; 

// update and create your two objects 
$user->save(); 

Beachten Sie, dass dadurch immer eine neueUserProfile erstellt wird. Wenn Sie den gleichen Code verwenden möchten eine UserProfile zu aktualisieren und zu erstellen, können Sie vielleicht so etwas wie:

// ... 

// instantiate a (new) profile and assign its data 
$profile = UserProfile::findFirstByUserId($user->getUserId()); 

if (!$profile) { 
    $profile = new UserProfile(); 
} 

$profile->assign($newProfileData); 

// ... 
1

Ich habe es jetzt .. bei der Zuweisung wie $ user-> UserProfile = $ newUserProfile; $ newUserProfile sollte ein Model Object sein.

Also mein neuer Code ist

$CoreUser = new CoreUser(); 

$user = $CoreUser->findFirst(array(
    //...condition here to find the row i want to update 
)); 
$profile = $user->UserProfile; //$profile is now model object which related to $user 

//assign new array data 
$profile->assign($newProfileData); 
$user->assign($newUserData); 
/* 
* can also assign one by one like 
* $user->first_name = $newProfileData['first_name']; 
* but cannot be like $profile = $newProfileData or $user->UserProfile = $newProfile 
* since it's gonna override it the model with array 
*/ 
$user->UserProfile = $profile; 

$user->update(); // it's working now 

Dank @Timothy für die Tipps zu .. :)

+1

btw, es ist nicht notwendig, '$ CoreUser' zu initialisieren Führen Sie statisch eine Abfrage für die 'CoreUser'-Klasse durch: $ user = CoreUser :: findFirst (['your-conditions']);' Dadurch sparen Sie eine Codezeile :) – Timothy

+0

btw, das $ user- > UserProfile = $ Profil; wendet die Methode "/ Models/Base :: update()" nicht an?/Models/Basis der Klasse, welche Benutzerprofil erweitert, die ich als Basismodell für alle Modelle erstelle. – Zoedia

+0

Wenn ich Ihren Code richtig interpretiere, dann '' '' '' '' user-> UserProfile 'erstellt' ein neues Profil anstatt 'update'- in einem. Deshalb ruft es nicht stattdessen '/ Models/Base :: update()' sondern ':: create()' auf. Ist es das, was du zu fragen versuchst? – Timothy