2017-12-23 9 views
1

Ich kämpfe mit einem Problem für eine beträchtliche Zeit, und ich kann keinen schönen Weg finden, mein Problem zu beheben.Phalcon - ORM Aktualisierung mit speichern Ursache doppelte Einträge

Sagen wir, ich habe zwei Tabellen:

uses (id, name)

uses_phone (id, user_id, phone)

Gesetzt ich geschaffen habe eine users (1, 'Mary') und ihre Telefone users_phones (1, 1, '123') (2, 1, '333')

Wenn ich will, Mary zu aktualisieren, ihren Namen zu ändern zu "Maria":

Die save() Methode nicht die tatsächlichen Datensätze in users_phone, löschen, aber neue Einträge insert, und dann werde ich:

1, 1, 123 2, 1, 333 3, 1, 123 4, 1, 333

Welches ist der beste Weg ist, um dieses Problem zu lösen? Ich bin ein bisschen verwirrt. Ich benutze gerne Model anstelle von PHQL (ich mag es auch, aber Models mit ORM scheinen still zu sein).

EDIT: Fügen Sie Code

ich meine Post aktualisiert haben die Modellbeziehungen und eine vereinfachte Version meiner Controller

Modell Beziehungen umfassen:

class Users { 
    ... 
    $this->hasMany('xid', 'UsersTelephones', 'xid_user', ['alias' => 'UsersTelephones']); 
    ... 
} 

class UsersTelephones { 
    ... 
    $this->belongsTo('xid_user', '\Users', 'xid', ['alias' => 'Users']); 
    ... 
} 

(sehr vereinfachte) Steuerung code:

function update($xid) { 
    ... 
    $user = Users::findFirstByXid($xid); 
    // $user->email = ".."; 

    $user_tfs = array(); 
    for ($i=0;$i<count($tfs_array);$i++) 
    { 
     $user_tfs[$i] = new UsersTelephones(); 
     $user_tfs[$i]->tf_number = $tfs_array[$i]; 
    } 
    $user->UsersTelephones = $user_tfs; 

    // ... 

    $user->save() 
} 

Vielen Dank für das Lesen und bitte verzeihen Sie mein schlechtes Englisch.

+0

Können Sie Ihre Frage mit dem Code aktualisieren verwendet, um Datensätze zu speichern?Überprüfen Sie auch Ihr Modell afterSave() oder andere ähnliche Event-Methoden. –

+0

Veröffentlichen Sie auch alle Modellassoziationsdefinitionen, die Sie haben. – YOMorales

+0

Danke sowohl für die kommentierung, ich habe meine Frage aktualisiert, bitte überprüfen Sie es. Vielen Dank! – candlejack

Antwort

1

an Ihrem Controller-Code sucht, ich habe ein paar Vorschläge:

1) Zuerst, von wo $tfs_array herkommt?

2) Sie möchten vielleicht auch die bestehenden Telefon Rekord id zum $user_tfs[$i] Objekt hinzuzufügen, wie: $user_tfs[$i]->id = $tfs_array[ID_OF_RECORD]; (Sie müssen den Datensatz-ID $tfs_array) hinzuzufügen. Auf diese Weise kann das ORM interpretieren, dass der Datensatz bereits existiert, da das Objekt einen Primärschlüssel id hat.

3) Warum möchten Sie iterativ die Objekte UsersTelephones hinzufügen, wenn Sie nur den neuen Namen speichern möchten? Sie können gehen wie:

$user = Users::findFirstByXid($xid); 
$user->name = 'New Name'; 
$user->save(); 

4) Sie können auch die $model->update() Methode statt save() aufrufen können.

Hier sind weitere Links: https://docs.phalconphp.com/en/3.2/db-models#create-update-records https://docs.phalconphp.com/en/3.2/db-models#create-update-with-confidence https://docs.phalconphp.com/en/3.2/db-models-relationships#updating-related-records

+0

Hallo! '$ tfs_array' ist nur ein Vektor von Strings, der aus früheren Validierungen/etc stammt. Das Problem ist, dass ich ein neues '$ tfs_array' von' POST' bekomme. Wie würde es funktionieren, eine ID zuzuweisen, wenn ich eine lösche? (und ich bearbeite alles, weil Benutzer viele Felder [sowohl in Benutzern als auch in anderen Tabellen] haben und es vermeiden möchten, nach Unterschieden zu suchen: /) – candlejack

+0

'Users :: findFirstByXid ($ xid);' sollte auch die Telefoneinträge erhalten mit diesem Benutzer. – YOMorales

+0

Wie kann ich ** die aktuellen Telefone löschen **? Ich folge nicht, wie ich sie löschen kann, wenn das Zuweisen eines leeren Arrays nicht – candlejack