CakePHP 3.x - hasMany par l'association, - trouver
En supposant que j'ai exactement la configuration comme dans le livre de recettes ici:
http://book.cakephp.org/3.0/en/orm/associations.html
class StudentsTable extends Table
{
public function initialize(array $config)
{
$this->belongsToMany('Courses', [
'through' => 'CourseMemberships',
]);
}
}
class CoursesTable extends Table
{
public function initialize(array $config)
{
$this->belongsToMany('Students', [
'through' => 'CourseMemberships',
]);
}
}
class CoursesMembershipsTable extends Table
{
public function initialize(array $config)
{
$this->belongsTo('Students');
$this->belongsTo('Courses');
}
}
Student BelongsToMany Course
Course BelongsToMany Student
id | student_id | course_id | days_attended | grade
Comment dois-je construire la requête pour trouver des Cours pour un Élève donné qu'il a Grade == "A"?
$query = $this->Courses->find('all')
->contain(['CourseMemberships'])
->where(['CourseMemberships.student_id' => $student['id'], 'CourseMemberships.grade' => 'A']);
Cela ne fonctionnera pas. Comment dois-je l'écrire?
Ce code déclenche l'erreur: "le Cours n'est pas associée à CourseMembers"
OriginalL'auteur Zbigniew Ledwoń | 2015-07-27
Vous devez vous connecter pour publier un commentaire.
Normalement, vous devriez utiliser correspondance, mais l'ORM ne semble pas à l'appui de la mise en correspondance sur la table de jointure "associations", comme ils ne sont pas "réels" des associations à ce point (vous pouvez suggèrent que, en tant qu'accessoire), ils sont ajoutés à un moment plus tard.
matching()
solution de contournementCe qui fonctionne c'est à l'aide de
matching()
etwhere()
sur la requête externe, c'est à direCela permettra de rejoindre le
students
table ainsi que lecourses_students
table de jointure à l'aide de laCourseMemberships
alias, commeet si les conditions peuvent être appliquées. Qui se sent comme un pas très gentil solution difficile.
D'une association (sans doute la meilleure approche)
Une autre option serait d'ajouter une autre, association explicite (comme mentionné @AtaboyJosef), c'est à dire un
hasMany
association pour la table de jointure (ceci sera fait automatiquement à un moment plus tard, mais comme déjà mentionné, il est trop tard pourmatching()
).Remarque que cela nécessitera la table de jointure pour être nommé
course_memberships
!De cette façon, vous pouvez utiliser d'appariement sur le
CourseMemberships
associationqui devrait créer une requête comme
qui peut être un peu plus efficace, car elle nécessite moins sélectionne.
C'est parce que la
contain()
ne devrait pas être là (ou utilisezTags
à la place) dans ce cas, j'ai négligé. Je vais mettre à jour ma réponse...De réponses mis à jour...
J'ai enlevé
contain()
et cela a fonctionné comme un charme. Mais maintenant j'ai 2 avertissements, je ne comprends pas:Warning (4096): Argument 1 passed to Cake\Database\Expression\QueryExpression::_addConditions() must be of the type array, null given, called in /Applications/MAMP/htdocs/sites/giftbooking/vendor/cakephp/cakephp/src/Database/Expression/QueryExpression.php on line 124 and defined [CORE/src/Database/Expression/QueryExpression.php, line 503]
Warning (2): Invalid argument supplied for foreach() [CORE/src/Database/Expression/QueryExpression.php, line 509]
Ouais, c'est un bug qui devrait être corrigé dans la prochaine release github.com/cakephp/cakephp/issues/7102 Si vous ne pouvez pas attendre, vous pouvez utiliser
dev-master
jusqu'à ce qu'il est disponible.OriginalL'auteur ndm
through
Permet de vous afin de vous donner le nom de la Table exemple, vous voulez utiliser sur la table de jointure, ou de l'instance elle-même. Cela rend la personnalisation de la table de jointure clés possible, et permet de personnaliser le comportement de la table pivot.Définir un plan plus spécifique de la relation à l'aide de la syntaxe de tableau:
Assurez-vous d'avoir des tables
courses
,students
, etcourse_memberships
.Maintenant exécuter le code:
Bien, je suis peur si vous avez vraiment besoin de quelque chose en rapport avec la
HasMany Associations
.OriginalL'auteur Ataboy Josef