yii 自己写的yii2 关联表查询询 怎么取关联表的字段数据

Yii2实现让关联字段支持搜索功能的方法
来源:易贤网&& 阅读:64 次&&日期:
温馨提示:易贤网小编为您整理了“Yii2实现让关联字段支持搜索功能的方法”,方便广大网友查阅!
本文实例讲述了Yii2实现让关联字段支持搜索功能的方法。分享给大家供大家参考,具体如下:
这里有两张表,表结构如下,companies_compay_id 为外键
yii2advanced.branches表:
branch_id:int(11)
companies_company_id:int(11)
branch_name:varchar(100)
branch_address:varchar(255)
branch_created_date:datetime
branch_status:enum('active','inactive')
<panies表:
company_id:int(11)
company_name:varchar(100)
company_email:varchar(100)
company_address:varchar(255)
logo:varchar(200)
company_start_date:datetime
company_create_date:datetime
company_status:enum('active','inactive')
在上面表中,可以用pany_name来获取公司名,不过这样是不支持搜索的。
想要支持搜索功能,需要在branches的index视图添加以下代码:
&?= GridView::widget([
& 'dataProvider' =& $dataProvider,
& 'filterModel' =& $searchModel,
& 'columns' =& [
& & ['class' =& 'yii\grid\SerialColumn'],
& & //添加的代码开始
& & & 'label'=&'公司名',
& & & 'attribute'=&'companies_company_id',
& & & 'value'=&'pany_name'
& & &//添加的代码结束
& & 'pany_name',
& & // 'branch_id',
& & // 'companies_company_id',
& & 'branch_name',
& & 'branch_address',
& & 'branch_created_date',
& & // 'branch_status',
& & ['class' =& 'yii\grid\ActionColumn'],
然后修改SearchBranches.php
修改rules方法为:
public function rules()
& return [
& & [['branch_id'], 'integer'],
& & [['branch_name', 'branch_address', 'branch_created_date', 'branch_status','companies_company_id'], 'safe'],
修改search方法:
public function search($params)
& $query = Branches::find();
& $dataProvider = new ActiveDataProvider([
& & 'query' =& $query,
& $this-&load($params);
& if (!$this-&validate()) {
& & // uncomment the following line if you do not want to any records when validation fails
& & // $query-&where('0=1');
& & return $dataP
& // 添加下面这行代码
& $query-&joinWith('companiesCompany');
& $query-&andFilterWhere([
& & 'branch_id' =& $this-&branch_id,
& // &'companies_company_id' =& $this-&companies_company_id,
& & 'branch_created_date' =& $this-&branch_created_date,
& $query-&andFilterWhere(['like', 'branch_name', $this-&branch_name])
& & -&andFilterWhere(['like', 'branch_address', $this-&branch_address])
& & -&andFilterWhere(['like', 'branch_status', $this-&branch_status])
& & &// 添加下面这行代码
& & -&andFilterWhere(['like', 'pany_name', $this-&companies_company_id]);
& return $dataP
刷新页面即可看到。
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
更多信息请查看
【】&&&&&【点此处查询各地各类考试咨询QQ号码及交流群】
易贤网手机网站地址:
由于各方面情况的不断调整与变化,易贤网提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
相关阅读 & & &
&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp会员注册
本站不参与评论!()
自觉遵守:爱国、守法、自律、真实、文明的原则
尊重网上道德,遵守中华人民共和国各项有关法律法规
严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的评论
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
您在本站发表的评论,本站有权保留、转载、引用或者删除
参与本评论即表明您已经阅读并接受上述条款Yii CGridView 详解(要害看关联表字段排序部分) - 编程当前位置:& &&&Yii CGridView 详解(要害看关联表字段排序部分)Yii CGridView 详解(要害看关联表字段排序部分)&&网友分享于:&&浏览:316次Yii CGridView 详解(关键看关联表字段排序部分)
Yii CGridView 详解(关键看关联表字段排序部分) //CGridView详解这东西在后台比较有用,能加速开发的速度,值得一看CGridView用表格的方式显示数据项每一行代表一个数据项,一列通常代表数据项的一个属性CGridView支持排序和分页,可以用ajax或普通的方式CgridView必序和data provider一起使用最简单的用法$dataprovider = new CActiveDataProvider(‘Post’);$this-&widget(‘zii.widgets.grid.CGridView’,array(‘dataProvider’=&$dataprovider,));这会用表格的方式显示每一条数据项,每一列是Post的一个属性在显示中带了分页和排序我们可以自定义CgridView::columns属性,以自定义表格列的显示方式这个cloumns如何配置呢?其是一个数组,每一个数组元素对应着一列的配置,可以是字符串或数组1、如果是字符串,格式是name:type:header 后两者是可选的,根据这三个值,创建一个CdatColumn实例其中type参见CFormatter2、如果是数组,其可以实例化CDdataColumn、ClinkColumn,CButtonColumn,CCheckBoxColumn实例,具体实例化哪个由数组中的class指定,默认是CDataColumn2.1,如果class=&’CDataCloumn’则可以指定name或者value,如果指定以value优先用CDataColumn时如何以关联表的数据序列?代码如下:表示可以post关联的author中的username排序列$dataprovider = new CActiveDataProvider(‘Post’,array(‘criteria’=&array(‘with’=&’author’,),‘sort’=&array(‘attributes’=&array(‘title’,'create_time’,‘author_id’=&array(‘asc’=&’author.username asc’,'desc’=&’author.username desc’,’label’=&’作者’))),));$this-&widget(‘zii.widgets.grid.CGridView’,array(‘dataProvider’=&$dataprovider,‘columns’=&array(‘title’,‘create_time’,array(‘name’=&’author_id’,'value’=&’$data-&author-&username’),),));另外CDataColumn还有一个filter属性,如果是空,那么生成一个textfield,如果是数组(键值),则生成一个dropDownlist在当前列的上部,供搜索2.2:如果class=&”CLinkColumn”array(‘class’=&’CLinkColumn’,'label’=&’查看用户’,'url’=&Yii::app()-&createURL(‘user/edit’))则生成一个连接2.3:如果class=”CCheckBoxColumn”array(‘class’=&’CCheckBoxColumn’,'name’=&’title’,'id’=&’select’),可以生成一个checkbox供选择,且只能选一个可以配置CGridView::selectableRows 如果是0,则不能选,如果 1,只选一个如果是2或其它值,则可以选多个代码如下:$this-&widget(‘zii.widgets.grid.CGridView’,array(‘dataProvider’=&$dataprovider,‘selectableRows’=&2,‘columns’=&array(array(‘class’=&’CCheckBoxColumn’,'name’=&’title’,'id’=&’select’),),2.3:如果class=”CButtonColumn”array(‘class’=&’CButtonColumn’,‘updateButtonUrl’=&’Yii::app()-&createUrl(“post/edit”,array(“id”=&$data-&id));’,),修改updateButtonUrl为编辑贴子如何用gridview生成一个代搜索的管理列表1、在Model的rules 设定可以搜索的属性array(‘title, status, create_time’, ‘safe’, ‘on’=&’search’),2、在Model中,添加搜索时的方法public function search(){$criteria=new CDbC$criteria-&compare(‘title’,$this-&title,true);$criteria-&compare(‘status’,$this-&status);$criteria-&compare(‘create_time’,$this-&create_time);return new CActiveDataProvider(‘Post’, array(‘criteria’=&$criteria,‘sort’=&array(‘defaultOrder’=&’status, update_time DESC’,),));}3、 在Controler中,写接受搜索用到的表单的值的方法public function actionAdmin(){$model=new Post(‘search’);if(isset($_GET['Post']))$model-&attributes=$_GET['Post'];$this-&render(‘admin’,array(‘model’=&$model,));}4、在view中用CGridView显示设置好&?php $this-&widget(‘zii.widgets.grid.CGridView’, array(‘dataProvider’=&$model-&search(),‘filter’=&$model,‘columns’=&array(),)); ?&以上代码大部分是yii自动生成的,只要做少量修改即可有时候会出现,搜索后页面为空的清况,原因可能是layout/main.php中echo $content外层无div,就是说main.php中必须有一个div包含$content
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有我有3张表,一张商品表,一张店面表,一张店面_商品关系表,是这样的:商品表(商品编号,商品名称,商品规格,商品图片,商品简介)店面表(店面编号,店面名称,店面状态,店面公告)店面_商品关系表(店面编号,商品编号,售价,库存,商品状态)而我根据‘店面编号’,想得到:商品编号,商品名称,商品规格,商品图片,商品简介,售价,库存,商品状态。所以只需要查2张表就行了。然后原生的sql:SELECT 店面_商品关系表.商品编号,商品名称,商品规格,商品图片,商品简介,售价,库存,商品状态 FROM 店面_商品关系表 LEFT JOIN 商品表 ON(店面_商品关系.商品编号=商品表.商品编号) WHERE 店面编号={$mallid}换成joinWith不明白的地方:$rs=MallToGoods::findBySql("SELECT `GoodsID`,`GoodsPrice`,`GoodsNum`,`GoodsState` FROM `malltogoods` WHERE `MallID`={$mallid}")-&joinWith('goodslist','true','LEFT JOIN')-&asarray()-&all();return $这样子能把malltogoods表里的GoodsID,GoodsPrice,GoodsNum,GoodsState都查出来,可是查不出'goodslist'表里的,后来我尝试把 ‘商品名称,商品规格,商品图片,商品简介’都写到select里头,它会报错在 店面_商品关系表 里没有这些列。所以我不明白我要怎么同时让2个表里要查的都显示在一起。看了文档上的 活动记录-&中间关联表:有时,两个表通过中间表关联,定义这样的关联关系, 可以通过调用 yii\db\ActiveQuery::via() 方法或yii\db\ActiveQuery::viaTable() 方法来定制 yii\db\ActiveQuery 对象 。举例而言,如果 order 表和 item 表通过中间表 order_item 关联起来,可以在 Order 类声明 items 关联关系取代中间表:class Order extends \yii\db\ActiveRecord{
public function getItems()
return $this-&hasMany(Item::className(), ['id' =& 'item_id'])
-&viaTable('order_item', ['order_id' =& 'id']);
}}所以我想也应该在我的model中添加关联。可是 店面和商品间是多对多的关系,一个店面下可以有多个商品,一个商品可以在多个店面下。我要添加怎么样的关联,而‘店面_商品关系表’和‘店面表’存在关系吗?还是说我的表设计的不合理?我不明白了,简单的说就是不明白原生的sql怎么改到这上面去。
暂无任何回答
30787人关注
13614人关注
11611人关注
Copyright (C)
All Rights Reserved | 京ICP备 号-2Yii2 ActiveRecord多表关联及多表关联搜索的实现
作者:白狼
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Yii2 ActiveRecord多表关联及多表关联搜索的实现的相关资料,需要的朋友可以参考下
Yii的ActiveRecord是与数据库打交道的类,也即MVC中的M(模型层),也是ORM的O(Object)。
一个老生常谈的问题。最近通过群里的反馈,觉得很多人还是没有去理解这个问题。今天把这个问题讲明白了,看看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表
* 关联auth表
public function getAuth()
// hasOne要求返回两个参数 第一个参数是关联表的类名 第二个参数是两张表的关联关系
// 这里uid是auth表关联id, 关联user表的uid id是当前模型的主键id
return $this-&hasOne(common\models\Auth::className(), ['uid' =& 'id']);
设置好了之后,并不代表两张数据表自动进行关联了!我们访问user列表页(该列表页采用gii生成,目前我们没操作过),通过debug查看Database Queries不难发现,实际中的query并没有进行关联auth表
2、在gridview中添加关联表的来源渠道字段source
&&#63;= GridView::widget([
// other codes
'columns' =& [
// other columns
'auth.source',
]); &#63;&
有同学感觉疑问了,上面不是说了没进行关联吗,这个怎么可以直接使用auth.source?
先别急,此时我们打开debug看看实际的query。
我们会发现有很多类似 select * from `auth` where uid =之类的操作,如果你的分页默认20条数据时,会有20个类似的query。
我们先搞明白发生了什么?
实际上这属于php的基础知识了。读取和写入对象的一个不存在的成员变量时, __get() __set() 魔术函数会被自动调用。yii也是利用了这一点对其进行了实现!
该操作跟大部分人在gridview中封装方法获取关联表数据几乎一致,但是!20条sql的查询明显增加了众多的开销。如果这里是left join操作多好!
3、优化sql
我们需要优化的是:
20条sql变1条sql
只获取关联表需要的字段
有同学要嚷嚷了,这里是yii自带的操作,怎么优化?我们回到数据源的获取上,发现user列表的数据是通过userSearch model的search方法提供的。
也就是说我们的数据查询实际上就没有去进行关联表查询!既然如此,我们就在UserSearch加上关联查询
$query = User::find();
$query-&joinWith(['auth']);
$query-&select("user.*, auth.source");
我们再来刷新下user列表页,然后通过debug分析发现有两条sql引起了我们的注意
SELECT `user`.*, `auth`.`source` FROM `user` LEFT JOIN `auth` ON `user`.`id` = `auth`.`uid` LIMIT 20
SELECT * FROM `auth` WHERE `user_id` IN (20个uid);
也就是说我么已经达到了优化sql的目的,通过debug分析发现,DB的查询时间少了很多。
4、关联表字段增加查询
gridview中的搜索模型也是通过searchModel实现的,该模型通过rules控制着哪个字段可搜索,哪个字段不可搜索。
我们现在需要增加关联表的source可搜索,因此我们在searchModel中定义一个属性source且添加到rules中
public function rules()
// other rules
['source', 'safe'],
接着我们把gridview中的auth.source修改一下
// 'auth.source',
'attribute' =& 'source',
'value' =& 'auth.source',
'label' =& '渠道来源',
到这里我们界面上是ok的,要实现程序上的搜索还差一步,我们在数据源获取的地方加上新增的source条件即可
$query-&andFilterWhere([
// other params
'auth.source' =& $this-&source,
下面给大家补充yii中ActiveRecord的一些用法
1,对象转数组
$model = new ActiveRecord();
$model.toArray();
由于ActiveRecord不是简单数组,不能直接json_encode,否则信息不完整。
解决办法:$model.toArray();这样就变为简单数组了,可以进行json_encode了。
2,通过名字或其他字段直接获取ActiveRecord的id。
$nIdcId = idc_info::model()-&find('name like :name',array(':name'=&"%".$strIdcName."%"))-&
我以前经常使用的办法是(现在发现很土):
$idc = Idc::model()-&find("...");
$id = $idc-&
3,对model的理解
$accModel = call_user_func(array(ActiveRecordName, 'model'));
= $accModel-&findByPk($id);
以上所述是小编给大家介绍的Yii2 ActiveRecord多表关联及多表关联搜索的实现的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 yii关联两张表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信