2017-07-05 1 views
0

J'ai deux modèles dans une relation de plusieurs à mai - utilisons des conférenciers et des étudiants comme exemple.Ajouter des éléments à Phalcon Relation plusieurs-à-plusieurs

class Lecturer 
{ 
    public function initialize() 
    { 
     $this->hasMany('studentId', 'Model\Entity\LecturerStudent', 'studentId', ['alias' => 'LecturerStudent']); 
     $this->hasManyToMany(
      'lecturerId', 
      'Model\Entity\LecturerStudent', 
      'lecturerId', 
      'studentId', 
      'Model\Entity\Student', 
      'studentId', 
      ['alias' => 'Students'] 
     ); 
    } 
} 

class LecturerStudent 
{ 
    public function initialize() 
    { 
     $this->belongsTo('studentId', 'Model\Entity\Student', 'studentId', ['alias' => 'Student']); 
     $this->belongsTo('lecturerId', 'Model\Entity\Lecturer', 'lecturerId', ['alias' => 'Lecturer']); 
    } 
} 

class Student 
{ 
    public function initialize() 
    { 
     $this->hasMany('lecturerId', 'Model\Entity\LecturerStudent', 'lecturerId', ['alias' => 'LecturerStudent']); 
    } 
} 

Maintenant, quand je veux ajouter des étudiants aux enseignants tout ce que je dois faire est:

$lecturerA = new Lecturer(); 
$studentA = new Student(); 
$studentB = new Student(); 
$lecturerA->Students = [$studentA, $studentB]; 
$lecturerA->save(); 

Tout cela fonctionne comme je pense.

Le problème se pose dans mon application lorsque j'importe un certain nombre d'enregistrements dans une transaction et que j'ai besoin d'ajouter un second tableau à la relation.

Ainsi, dans l'exemple:

$lecturerA = new Lecturer(); 
$studentA = new Student(); 
$studentB = new Student(); 
$lecturerA->Students = [$studentA, $studentB]; 

... other code doing other things ... 

$studentC = new Student(); 
$studentD = new Student(); 
$lecturerA->Students = [$studentC, $studentD]; 

... more code ... 

$lecturerA->save(); 

Dans ce cas, seul l'élément (s) ajouté dans la deuxième affectation à Students sont enregistrés. Les articles de la première affectation sont perdus. Donc, dans mon exemple, seuls studentC et studentD seront écrits dans la base de données.

Existe-t-il une manière correcte de faire ceci - pour ajouter à une précédente rangée many-to-many - dans Phalcon? J'ai une alternative (messier) de faire cela dans la classe qui effectue l'importation, mais si c'est la bonne façon, je préférerais de beaucoup l'utiliser.

Répondre

0

Vous devez stocker des objets élèves dans un tableau temporaire, car la seconde affectation écrase $lectureA->Students.

$lecturerA = new Lecturer(); 
$studentA = new Student(); 
$studentB = new Student(); 
$tmpStudents = [$studentA, $studentB]; 

... other code doing other things ... 

$studentC = new Student(); 
$studentD = new Student(); 
$tmpStudents = $tmpStudents + [$studentC, $studentD]; 
$lecturerA->Students = $tmpStudents; 

... more code ... 

$lecturerA->save(); 

ou vous pouvez appeler $lecturerA->save() méthode après avoir défini les étudiants relationship.But hors Bien sûr, cela entraînera le trafic réseau supérieur parce que chaque fois que vous appelez save(), INSERT ou UPDATE requête devra être faite à SGBDR.

$lecturerA = new Lecturer(); 
$studentA = new Student(); 
$studentB = new Student(); 
$lecturerA->Students = [$studentA, $studentB]; 
$lecturerA->save(); 

... other code doing other things ... 

$studentC = new Student(); 
$studentD = new Student(); 
$lecturerA->Students = [$studentC, $studentD]; 

... more code ... 

$lecturerA->save();