Maison >développement back-end >tutoriel php >Explication détaillée de l'utilisation des requêtes associées hasOne, hasMany et many-to-many dans Yii2
Cet article présente principalement l'utilisation détaillée des requêtes associées hasOne, hasMany et many-to-many dans Yii2. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
Avant-propos
hasOne et hasMany sont les fonctions uniques de Yii2 pour les requêtes liées à plusieurs tables. Il est recommandé de les utiliser lors de l'utilisation de requêtes liées à plusieurs tables. Pourquoi? Parce que les résultats des requêtes associées de cette manière conserveront la propre fonction de tri d'en-tête de Yii2, ainsi que la valeur de stockage de l'identifiant de l'entrée dans CheckboxColumn. Quant à savoir s'il existe d'autres avantages, tout le monde doit les découvrir. jusqu’à présent. Un bénéfice commun. Il n'existe aucune autre requête associée, telle que la requête yiidbQuery ou la requête d'instruction SQL native. Lorsque la requête est affichée dans la liste, l'en-tête du tableau est noir. Les requêtes hasOne et hasMany multi-tables de Yii2, qu'il s'agisse d'un document ou d'un article, peuvent en fait facilement trouver le maître de référence. Mais pourquoi l'auteur a-t-il écrit cet article ? dans Je n'ai pas vu l'utilisation de requêtes liées plusieurs-à-plusieurs dans les informations précédentes, je ne me répéterai pas ni d'autres. L'accent de cet article est sur l'utilisation de requêtes liées plusieurs-à-plusieurs pour augmenter vos connaissances.Analyse des exigences
1 Utilisez une instruction de requête pour afficher toutes les données de la liste. Relations un-à-un Plusieurs et plusieurs-à-plusieurs. 2. La fonction de tri d'en-tête de Yii2 et la valeur de stockage de l'identifiant de l'entrée dans CheckboxColumn ne peuvent pas être détruites.Rendu
1. Un à un, un à plusieurs, plusieurs à plusieurs, tri d'en-tête. 2. La valeur identifiant de l'entrée dans CheckboxColumn.Analyse de code
Plusieurs à plusieurs
Exemple : Un client peut avoir plusieurs étiquettes, et une étiquette peut être destinée à plusieurs clients. 1. Ajoutez le code suivant à TSales (le modèle de la table client) :public function getcommon_tag() { return $this->hasMany(CommonTag::className(), ['itemid' => 't_id'])->onCondition(['idtype' => "内容"])->joinWith(['tag']); }Remarque : La table common_tag ici est une table intermédiaire, une fois la table intermédiaire common_tag associée à la table client à l'aide de hasMany, joinWith(['tag']) doit être ajouté à la fin pour associer la table de balises. onCondition est une méthode avec des conditions supplémentaires. 2. Ajoutez le code suivant au CommonTag (modèle de table intermédiaire) pour associer la table de balises, utilisez simplement hasOne.
public function gettag() { return $this->hasOne(Tag::className(), ['id'=>'tagid']); }3. Ajoutez le code suivant à TSalesSearch (modèle de recherche du client) pour associer la table intermédiaire common_tag : $query->joinWith([' common_tag ']);4. Le code de sortie de la page est le suivant :
[ 'attribute' => 'tag_id', 'value' => function ($model) { $_tag=$model->getRelatedRecords()['common_tag']; if(!empty($_tag)){ $tagName=""; foreach ($_tag as $key => $value) { $tagName.=$value['tag']['name'].'/'; } return rtrim($tagName,'/'); } }, ],Remarque : $model->getRelatedRecords () est utilisé pour obtenir la valeur du tableau [_rated:yiidbBaseActiveRecord:private].
Un-à-plusieurs
1. hasMany impliqué dans l'utilisation plusieurs-à-plusieurs précédente est une utilisation un-à-plusieurs pour atteindre un-à-plusieurs. -many, supprimez simplement le joinWith à la fin. Les autres configurations et méthodes de sortie sont les mêmes.One-to-one
1. L'utilisation individuelle est également mentionnée plus tôt. hasOne est une utilisation individuelle. le même que hasMany, donc ce n'est pas nécessaire ici.Notes
1 Lorsque la valeur de la requête associée ne peut pas être obtenue à l'aide de la sortie de code suivante (common_tag.name), cela signifie. votre table client doit avoir ce champ de nom et la valeur est vide. Une fois le nom répété, les champs de la table principale seront affichés en premier. La solution est : $model->getRelatedRecords().[ 'attribute' => 'tag_id', 'value' => 'common_tag.name' ]Recommandations associées :
Méthode Yii2 pour implémenter la recherche simultanée de plusieurs champs
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!