2017-08-21 3 views
0

j'ai un complexe de rejoindre commeLes associations complexes - 3.x CakePHP [Nested belongsToMany]

A appartient à plusieurs B jeté AB Table AB appartient à beaucoup C ABC tableau jeté

Maintenant, mon problème est de savoir comment Je peux obtenir des données dans le contrôleur A qui contiennent le résultat jusqu'à la table ABC. Ne trouvant pas de relation directe dans une table et ABC

Ma structure de base de données est

Tableau A (id, nom, code) Tableau B (id, nom, code) Tableau C (id, nom, code) Tableau AB (id, a_id, b_id, frais) Tableau ABC (ab_id, C_Id, opt_date, tno)

Je peux me connecter avec B en utilisant ci-dessous requête, mais ne savez pas comment obtenir des données pour ABC

$this->A->find('list',[ 
contain => ['B'] 
    ]); 

Ici, je suis en train de changer à mon régime réel

1. courses (id, name, course_code, etc...) 
2. sessions (id, name, status, start_date, end_date) 
3. seats (id, name, description, metadata, status) 
4. courses_sessions (id, course_id, session_id, programme_coordinator, academic_coordinator, status) 
5. courses_sessions_seats (id, courses_session_id, seats_id, no_seats) 

Relations actuelles

a) courses belongsToMany sessions using courses_sessions 
b) courses_sessions belongsToMany seats using courses_sessions_seats 

Je ne sais pas si le cas de deux est possible sur pas, mais ce que je veux est de montrer les détails du cours avec places disponibles par catégorie session sage.

+0

liste Recherche ne retourne que deux champs - clé primaire et champ d'affichage comme array [primary_key => display_field] aucun autre champ ne sera sélectionné. – icebreaker

+0

https://book.cakephp.org/3.0/en/orm/associations.html#using-the-through-option est la chose à regarder dans la documentation – icebreaker

Répondre

0

En bref, il pourrait ressembler à ceci

$this->A 
    ->find() 
    ->contain([ 
     'B' => ['C'] 
     ]); 

ou

$this->A 
    ->find() 
    ->contain([ 
     'B' => function($q) { 
     return $q->contain(['C']);  
     }]); 

Vous pouvez lire à ce sujet here in docs

EDIT

Ce que je pense schéma de la table

  1. courses_sessions
    • course_sessions belongsTo Cours
    • course_sessions belongsTo session
  2. courses_sessions_seats
    • courses_sessions_seats belongsTo course_sessions
    • courses_sessions_seats Belon gsto sièges

Si vous faites des modèles de cette façon, vous aurez plus de contrôle sur les requêtes plus tard.

EDIT2

Pour obtenir toutes les données du point de vue de cas Cours vous utilisez

$courses = $this->Courses 
    ->find() 
    ->contain([ 
    'CoursesSessions' => ['Sessions', 'SessionsSeats'] 
    ]); 
foreach ($courses as $course) : 
    // Your code here 
endforeach; 

Il est facile

+0

Ami ce n'est pas ma condition. C'est différent alors. Un belongsToMany B utilisant AB (Joined Table) et AB (Joined Table) belongsToMany C utilisant la table ABC. –

+0

Merci pour votre rediffusion. Like Courses belongsToMany Session en utilisant CoursSession table. Maintenant, dans chaque session, il n'y a pas de sièges différents pour chaque catégorie. So Now CoursesSession belongsToMany Catégories utilisant CategoryCoursesSession table (en utilisant la clé primaire de CourseSession table). J'espère que vous aurez la bonne situation. –

+0

Si vous avez cette torsion complexe dans votre base de données, vous pouvez (et à mon humble avis) le réduire à la structure hasMany et belongsTo. Ce sera plus facile à maintenir. Et mettre à jour la question à votre schéma réel ou prendre le temps de le rendre compréhensible. – icebreaker