search
HomeBackend DevelopmentPHP Tutorialyii2 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>

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1140067.htmlTechArticleyii2 ActiveRecord多表关联以及多表关联搜索的实现,yii2activerecord 一个老生常谈的问题。最近通过群里的反馈,觉得很多人还是没有去理解这个...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Laravel开发:如何使用Laravel Scout实现全文搜索?Laravel开发:如何使用Laravel Scout实现全文搜索?Jun 14, 2023 am 10:14 AM

Laravel开发:如何使用LaravelScout实现全文搜索?LaravelScout是一个Laravel的全文搜索解决方案,它是一个流行的开源软件,它可以让开发者轻松地实现高效的全文搜索功能。在这篇文章中,我们将介绍如何使用LaravelScout来实现全文搜索功能。安装LaravelScout首先,我们需要安装LaravelScout。可以

PHP如何对接淘宝商品搜索API文档PHP如何对接淘宝商品搜索API文档Jul 01, 2023 pm 10:16 PM

PHP如何对接淘宝商品搜索API文档淘宝是中国最大的电子商务平台之一,拥有庞大的商品库存和用户群体。对于开发者来说,通过对接淘宝的API接口,可以获取商品信息、推广活动以及进行交易等功能,从而实现个性化的商业应用。本文将介绍如何使用PHP语言对接淘宝商品搜索API,帮助开发者快速构建自己的电商应用。第一步:注册成为淘宝开发者在开始之前,需要先注册成为淘宝开发

yii2 怎么去掉jqueryyii2 怎么去掉jqueryFeb 17, 2023 am 09:55 AM

yii2去掉jquery的方法:1、编辑AppAsset.php文件,注释掉变量$depends里的“yii\web\YiiAsset”值;2、编辑main.php文件,在字段“components”下面添加配置为“'yii\web\JqueryAsset' => ['js' => [],'sourcePath' => null,],”即可去掉jquery脚本。

如何让MySQL外键和主键自动关联起来?如何让MySQL外键和主键自动关联起来?Mar 15, 2024 pm 12:54 PM

如何让MySQL外键和主键自动关联起来?在MySQL数据库中,外键和主键是非常重要的概念,它们能够帮助我们在不同表之间建立关联关系,保证数据的完整性和一致性。在实际的应用过程中,经常需要让外键自动关联到对应的主键上,以避免数据不一致的情况发生。下面将介绍如何通过具体的代码示例实现这一功能。首先,我们需要创建两个表,一个表作为主表,另一个表作为从表。在主表中创

什么是PHP-Activerecord框架?什么是PHP-Activerecord框架?Jun 05, 2023 am 08:51 AM

PHP-Activerecord框架是一个轻量级的ORM(对象关系映射)框架,能够将数据库中的表与PHP对象进行映射,使得开发人员可以使用面向对象的方式来操作数据库,而无需编写复杂的SQL语句。它源于RubyonRails框架中的ActiveRecord模式,而PHP-Activerecord框架则是其在PHP语言中的实现。该框架的主要思想是将数据库中的

如何在uniapp中实现关键字搜索如何在uniapp中实现关键字搜索Jul 05, 2023 am 08:53 AM

如何在uniapp中实现关键字搜索在当前信息爆炸的时代,搜索已经成为我们获取所需信息的重要方法之一。在移动端应用开发中,如何在uniapp中实现关键字搜索,提供用户便捷的搜索功能,是一个非常重要的技术挑战。本文将介绍在uniapp中实现关键字搜索的方法,并提供代码示例供参考。一、创建搜索框组件首先,我们需要在uniapp中创建一个搜索框组件,用于用户输入关键

在C语言中,评估(Evaluation)、优先级(Precedence)和关联(Association)是什么?在C语言中,评估(Evaluation)、优先级(Precedence)和关联(Association)是什么?Sep 03, 2023 pm 09:49 PM

“C”编译器根据优先级和关联性规则对表达式进行求值。如果表达式包含不同优先级运算符,则会考虑优先级规则。这里,首先评估10*2,因为'*'比'-'和'='具有更高的优先级如果表达式包含相同的优先级,则考虑关联性规则,即从左到右(或从右到左)。

UniApp实现搜索功能的配置与实现技巧UniApp实现搜索功能的配置与实现技巧Jul 04, 2023 pm 05:15 PM

UniApp实现搜索功能的配置与实现技巧随着移动互联网的迅速发展,搜索功能已经成为了几乎每一个应用都必备的功能之一。而对于基于Vue.js的多平台应用开发框架UniApp来说,实现搜索功能也变得更加简单和高效。本文将介绍UniApp中搜索功能的配置与实现技巧,并且附带代码示例,帮助读者快速上手。一、配置搜索功能在uni-app项目的页面文件夹中创建一个搜索页

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use