详解Yii2.0使用AR联表查询实例

Yii2.0中使用联表查询有两种办法,第一种是查询构建器(Query Builder),第二种使用活动记录(Active Record),中文网对查询构建器讲的很详细,AR则说的很坑爹,下面贴出自己实践的方法,以供参考。

两个表

{{%article}} 和 {{%article_class}}

{{%article}} .article_class关联{{%article_class}}.id

1、要使用AR做关联查询,首先在models {Article} 中创建关联:

class Article extends \yii\db\ActiveRecord { //这里声明被关联字段 public $class_name; /** * @inheritdoc */ public static function tableName() { return '{{%article}}'; } ... //关联 mysite_article_class 表 public function getArticleClass(){ /** * 第一个参数为要关联的子表模型类名称, * 第二个参数指定通过子表的 id 去关联主表的 article_class 字段 */ return $this->hasMany(ArticleClass::className(), ['id' => 'article_class']); } }

2、在controllers {ArticleController}中使用,

public function actionIndex() { $article = new Article(); if(Yii::$app->request->get('class')){ $query = Article::find() ->joinWith('articleClass') ->select(['{{%article}}.*,{{%article_class}}.class_name']) ->where(['article_class' => Yii::$app->request->get('class')]); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); }else{ $query = Article::find() ->joinWith('articleClass') ->select(['{{%article}}.*,{{%article_class}}.class_name']); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); } return $this->render('index', [ 'dataProvider' => $dataProvider, 'model' => $article, ]); }

3、在view {GridView}中使用

<?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', //'article_content:ntext', [ 'value'=>'class_name', 'label'=>'文章分类', ], 'article_title', 'article_addtime:datetime', // 'article_updatetime:datetime', // 'article_author', ['class' => 'yii\grid\ActionColumn'], ], ]); ?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-20 13:52:32

详解Yii2.0使用AR联表查询实例的相关文章

详解Yii2.0 rules验证规则集合

我最近也在学习Yii2的路上,那么今天也算个学习笔记吧! required : 必须值验证属性 复制代码 代码如下: [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredValidator 的别名, 确保了特性不为空. email : 邮箱验证 复制代码 代码如下: ['email', 'email']; #说明:CEmailValidator的别名,确保了特性的值是一个有效的电邮地址. match

优化mysql嵌套查询和联表查询

优化mysql嵌套查询和联表查询 嵌套查询糟糕的优化 在上面我提到过,不考虑特殊的情况,联表查询要比嵌套查询更有效.尽管两条查询表达的是同样的意思,尽管你的计划是告诉服务器要做什么,然后让它决定怎么做,但有时候你非得告诉它改怎么做.否则优化器可能会做傻事.我最近就碰到这样的情况.这几个表是三层分级关系:category, subcategory和item.有几千条记录在category表,几百条记录在subcategory表,以及几百万条在item表.你可以忽略category表了,我只是交代一

详解Android中图片的三级缓存及实例

详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

mysql 查询慢-mysql 近5万条数据的表 使用联表查询 出现服务器CPU占用过多

问题描述 mysql 近5万条数据的表 使用联表查询 出现服务器CPU占用过多 mysql 近5万条数据的表 使用联表查询 出现服务器CPU占用过多,贴大神代码求优化指点!!!!!有两张表分别为:lu_yccdd 和 lu_taizhang使用的联表查询代码:SELECT distinct(t.sc_time) sc_timecount(distinct(y.id)) totalcount(distinct(t.cdd_id)) tjjg(count(distinct(y.id))-count(

select-sql语句的联表查询的效率问题

问题描述 sql语句的联表查询的效率问题 select * from a,b where a.id = b.id select * from a inner join b on a.id = b.id 这两种哪一种效率更高呢 , 推荐使用哪一种? 第二种叫内连接 , 第一种方式叫什么来着?忘记了 .... 解决方案 第一个是等值连接,第二个是内连接,这俩效果一样,效率也一样 解决方案二: 这两个写法都是内连接 解决方案三: 查询低效率的sql语句 解决方案四: 都叫内连接,也叫等值连接

数据-mybaits 怎么做联表查询

问题描述 mybaits 怎么做联表查询 我想 查询 两个表的数据 例如 a ,b "这里 怎么写" "这里怎么写" 我查出来的 只是 一个表的数据 解决方案 http://www.th7.cn/Program/java/201312/165806.shtml 解决方案二: 具体怎么做自己查找 解决方案三: 我只是试一下代码是不是不显示

在Derby数据库中联表查询的时候遇到两个表中相同的列名如何使用rs.getString(表名.列名查询)?表名.列名试过不行

问题描述 在Derby数据库中联表查询的时候遇到两个表中相同的列名如何使用rs.getString(表名.列名查询)?表名.列名试过不行.希望高手回答!!!!! 解决方案 解决方案二:自己顶顶先等待高手的答复~~~~~解决方案三:好像一般数据库的都不行一种方式用列序号取,最好还是改成其他名字解决方案四:终于有兄弟回复了,感激一下先.但是很多数据库都是支持的,比如说我们可爱的MySQL,SQLServer之类的稳定的数据库.Derby肯定是有的,但是我们不知道罢了.它的语法格式解决方案五:查询的时

java-Spring data jpa 如何进行分页联表查询?

问题描述 Spring data jpa 如何进行分页联表查询? 具体使用jpa方法:Page findAll(Specification spec, Pageable pageable); 查询语句:select t.vehicle_id,t.id_number,t.org_code,t.vehicleStatus,t4.TYPE_NAME,t1.TERMINAL_ID,t2.TTYPE_NAME,T3.SIM_NUM from V_VEHICLEINFO t left join T_TERM

详解PHP中websocket的使用方法_php实例

关于PHP中websocket使用的详细注解,供大家参考. 服务端:  <?php //send用户加入 //send1发送信息 //send2退出登录 error_reporting(E_ALL ^ E_NOTICE); ob_implicit_flush(); //file_put_contents('lz.text','123', FILE_APPEND); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $s