yii2 ActiveRecord多表关联以及多表关联搜索的实现,yii2activerecord_PHP教程
yii2 ActiveRecord多表关联以及多表关联搜索的实现,yii2activerecord
一个老生常谈的问题。最近通过群里的反馈,觉得很多人还是没有去理解这个问题。今天把这个问题讲明白了,看看yii2 ActiveRecord是怎么个多表关联以及如何去优化这个关联。
场景需求:
假设我们有一张用户表user和一张用户渠道表auth,两张数据表通过user.id和auth.uid进行一对一关联。现需要在user列表展示auth表的来源渠道source,且该渠道可搜索。
首先我们先通过gii生成user和auth系列相关的model和操作。此处不做详细说明,有关gii的操作可参考xxx
我看继续看重要的几个操作步骤:
1、找到user表对应的AR模型类 common\models\User.php,在该类文件中进行关联auth表
<span>/*</span><span>* * 关联auth表<br /> * @see http://www.manks.top/yii2_many_ar_relation_search.html </span><span>*/</span> <span>public</span> <span>function</span><span> getAuth() { </span><span>//</span><span> hasOne要求返回两个参数 第一个参数是关联表的类名 第二个参数是两张表的关联关系 // 这里uid是auth表关联id, 关联user表的uid id是当前模型的主键id</span> <span>return</span> <span>$this</span>->hasOne(common\models\Auth::className(), ['uid' => 'id'<span>]); }</span>
设置好了之后,并不代表两张数据表自动进行关联了!我们访问user列表页(该列表页采用gii生成,目前我们没操作过),通过debug查看Database Queries不难发现,实际中的query并没有进行关联auth表
2、在gridview中添加关联表的来源渠道字段source
<?= GridView::<span>widget([ </span><span>//</span><span> other codes</span> 'columns' =><span> [ </span><span>//</span><span> other columns</span> 'auth.source',<span> ] ]); </span>?>
有同学感觉疑问了,上面不是说了没进行关联吗,这个怎么可以直接使用auth.source?
先别急,此时我们打开debug看看实际的query。
我们会发现有很多类似 select * from `auth` where uid = xxx;之类的操作,如果你的分页默认20条数据时,会有20个类似的query。
我们先搞明白发生了什么?
实际上这属于php的基础知识了。读取和写入对象的一个不存在的成员变量时, __get() __set() 魔术函数会被自动调用。yii也是利用了这一点对其进行了实现!
该操作跟大部分人在gridview中封装方法获取关联表数据几乎一致,但是!20条sql的查询明显增加了众多的开销。如果这里是left join操作多好!
3、优化sql
我们需要优化的是:
20条sql变1条sql
只获取关联表需要的字段
有同学要嚷嚷了,这里是yii自带的操作,怎么优化?我们回到数据源的获取上,发现user列表的数据是通过userSearch model的search方法提供的。
也就是说我们的数据查询实际上就没有去进行关联表查询!既然如此,我们就在UserSearch加上关联查询
<span>$query</span> = User::<span>find(); </span><span>$query</span>->joinWith(['auth'<span>]); </span><span>$query</span>->select("user.*, auth.source");
我们再来刷新下user列表页,然后通过debug分析发现有两条sql引起了我们的注意
SELECT `user`.*, `auth`.`source` FROM `user` LEFT <span>JOIN</span> `auth` ON `user`.`id` = `auth`.`uid` LIMIT 20<span> SELECT </span>* FROM `auth` WHERE `user_id` IN (20个uid);
也就是说我么已经达到了优化sql的目的,通过debug分析发现,DB的查询时间少了很多。
4、关联表字段增加查询
gridview中的搜索模型也是通过searchModel实现的,该模型通过rules控制着哪个字段可搜索,哪个字段不可搜索。
我们现在需要增加关联表的source可搜索,因此我们在searchModel中定义一个属性source且添加到rules中
<span>public</span> <span>$source</span><span>; </span><span>public</span> <span>function</span><span> rules() { </span><span>return</span><span> [ </span><span>//</span><span> other rules</span> ['source', 'safe'],<span> ]; }</span>
接着我们把gridview中的auth.source修改一下
<span>//</span><span> 'auth.source',</span> <span>[ </span>'attribute' => 'source', 'value' => 'auth.source', 'label' => '渠道来源',<span> ]</span>,
到这里我们界面上是ok的,要实现程序上的搜索还差一步,我们在数据源获取的地方加上新增的source条件即可
<span>$query</span>-><span>andFilterWhere([ </span><span>//</span><span> other params</span> 'auth.source' => <span>$this</span>->source,<span> ]);</span>

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Avec l’essor des réseaux sociaux, WeChat est devenu l’un des outils de communication indispensables dans la vie quotidienne des gens. Cependant, de nombreuses personnes peuvent rencontrer un problème : se connecter à plusieurs comptes WeChat en même temps sur le même téléphone mobile. Pour les utilisateurs de téléphones mobiles Huawei, il n'est pas difficile d'obtenir une double connexion WeChat. Cet article explique comment obtenir une double connexion WeChat sur les téléphones mobiles Huawei. Tout d'abord, le système EMUI fourni avec les téléphones mobiles Huawei offre une fonction très pratique : l'ouverture d'une double application. Grâce à la fonction de double ouverture de l'application, les utilisateurs peuvent simultanément

Comment Xianyu recherche-t-il des utilisateurs ? Dans le logiciel Xianyu, nous pouvons trouver directement les utilisateurs avec lesquels nous souhaitons communiquer dans le logiciel. Mais je ne sais pas comment rechercher des utilisateurs. Visualisez-le simplement parmi les utilisateurs après la recherche. Vient ensuite l'introduction que l'éditeur propose aux utilisateurs sur la façon de rechercher des utilisateurs. Si vous êtes intéressé, venez jeter un œil ! Comment rechercher des utilisateurs dans Xianyu ? Réponse : Afficher les détails parmi les utilisateurs recherchés Introduction : 1. Entrez le logiciel et cliquez sur la zone de recherche. 2. Entrez le nom d'utilisateur et cliquez sur Rechercher. 3. Sélectionnez ensuite [Utilisateur] sous la zone de recherche pour trouver l'utilisateur correspondant.

À l'ère dominée par l'intelligence, les logiciels de bureautique sont également devenus populaires et les formulaires Wps sont adoptés par la majorité des employés de bureau en raison de leur flexibilité. Au travail, nous devons non seulement apprendre à créer des formulaires simples et à saisir du texte, mais également à maîtriser des compétences plus opérationnelles afin d'accomplir les tâches du travail réel. Les rapports contenant des données et l'utilisation de formulaires sont plus pratiques, clairs et précis. La leçon que nous vous apportons aujourd'hui est la suivante : la table WPS ne trouve pas les données que vous recherchez. Pourquoi veuillez vérifier l'emplacement de l'option de recherche ? 1. Sélectionnez d'abord le tableau Excel et double-cliquez pour l'ouvrir. Ensuite dans cette interface, sélectionnez toutes les cellules. 2. Ensuite, dans cette interface, cliquez sur l'option « Modifier » dans « Fichier » dans la barre d'outils supérieure. 3. Deuxièmement, dans cette interface, cliquez sur «

Le langage de programmation PHP est un outil puissant pour le développement Web, capable de prendre en charge une variété de logiques et d'algorithmes de programmation différents. Parmi eux, l’implémentation de la séquence de Fibonacci est un problème de programmation courant et classique. Dans cet article, nous présenterons comment utiliser le langage de programmation PHP pour implémenter la séquence de Fibonacci et joindrons des exemples de code spécifiques. La suite de Fibonacci est une suite mathématique définie comme suit : le premier et le deuxième élément de la suite valent 1, et à partir du troisième élément, la valeur de chaque élément est égale à la somme des deux éléments précédents. Les premiers éléments de la séquence

Le logiciel de l'application mobile Taobao propose de nombreux bons produits. Vous pouvez les acheter à tout moment et n'importe où, et tout est authentique. Il n'y a aucune opération compliquée, ce qui vous permet de faire des achats plus pratiques. Vous pouvez rechercher et acheter librement à votre guise. Les sections de produits des différentes catégories sont toutes ouvertes. Ajoutez votre adresse de livraison personnelle et votre numéro de contact pour permettre à l'entreprise de messagerie de vous contacter, et vérifiez les dernières tendances logistiques en temps réel. les utilisateurs l'utilisent pour la première fois. Si vous ne savez pas comment rechercher des produits, il vous suffit bien sûr de saisir des mots-clés dans la barre de recherche pour trouver tous les résultats des produits. Vous ne pouvez pas arrêter d'acheter librement. L'éditeur fournira des méthodes en ligne détaillées permettant aux utilisateurs mobiles de Taobao de rechercher des noms de magasins. 1. Ouvrez d'abord l'application Taobao sur votre téléphone mobile,

Comment mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei Avec la popularité des logiciels sociaux et l'importance croissante accordée à la confidentialité et à la sécurité, la fonction de clonage WeChat est progressivement devenue le centre d'attention. La fonction de clonage WeChat peut aider les utilisateurs à se connecter simultanément à plusieurs comptes WeChat sur le même téléphone mobile, ce qui facilite la gestion et l'utilisation. Il n'est pas difficile de mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei. Il vous suffit de suivre les étapes suivantes. Étape 1 : Assurez-vous que la version du système de téléphonie mobile et la version de WeChat répondent aux exigences. Tout d'abord, assurez-vous que la version de votre système de téléphonie mobile Huawei a été mise à jour vers la dernière version, ainsi que l'application WeChat.

Dans le domaine actuel du développement logiciel, Golang (langage Go), en tant que langage de programmation efficace, concis et hautement simultané, est de plus en plus favorisé par les développeurs. Sa riche bibliothèque de normes et ses fonctionnalités de concurrence efficaces en font un choix de premier plan dans le domaine du développement de jeux. Cet article explorera comment utiliser Golang pour le développement de jeux et démontrera ses puissantes possibilités à travers des exemples de code spécifiques. 1. Avantages de Golang dans le développement de jeux. En tant que langage typé statiquement, Golang est utilisé dans la construction de systèmes de jeux à grande échelle.

Guide d'implémentation des exigences du jeu PHP Avec la popularité et le développement d'Internet, le marché des jeux Web devient de plus en plus populaire. De nombreux développeurs espèrent utiliser le langage PHP pour développer leurs propres jeux Web, et la mise en œuvre des exigences du jeu constitue une étape clé. Cet article explique comment utiliser le langage PHP pour implémenter les exigences courantes du jeu et fournit des exemples de code spécifiques. 1. Créer des personnages de jeu Dans les jeux Web, les personnages de jeu sont un élément très important. Nous devons définir les attributs du personnage du jeu, tels que le nom, le niveau, la valeur de l'expérience, etc., et fournir des méthodes pour les exploiter.
