首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示比表更多记录的Yii2网格视图

显示比表更多记录的Yii2网格视图
EN

Stack Overflow用户
提问于 2016-02-25 01:45:45
回答 3查看 605关注 0票数 1

我有两个mysql表:

有51张唱片的People

  • id
  • 名字
  • ..。

People统计有131个记录

  • id
  • peopleID
  • 日期
  • 星辰
  • ..。

如果我在模型/PeopleSearch.php上设置了这个

代码语言:javascript
复制
$query->joinWith('peopleStats');

GridView显示131个记录。我如何将连接设置为只获取最后一天的记录(使用MAX(date)的查询),以便GridView在每个人项上只显示51条记录和最新数据?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-25 08:55:31

这对于ActiveDataProvider-backed GridView来说是一个常见的问题。网格需要知道数据集中有多少模型。同时,仅仅为了计算所有模型,获取和实例化它们将是极其低效的。这就是为什么ActiveDataProvider从SQL获得总模型计数的原因,假设结果集中的每一行都对应于一个模型。

现在,您已经在查询中引入了一个JOIN。这会增加结果集中的行数(从51行增加到131行)。总模型计数并不是唯一打破的东西,你也应该有一个问题的分页。请注意,您可以使用all()函数获取所有模型(就像在People::find()->joinWith('peopleStats')->all()中那样,它足够聪明地删除冗余行,因此您可以使用all()精确地得到51个模型。

现在,有几个解决办法。首先,在数据提供程序中执行joinWith()的唯一原因是需要对相关数据进行筛选或排序。如果不是这样的话,使用with()就可以了。

如果确实需要对相关数据进行筛选/排序,则还有另一种解决办法,即只从主表->select('people.*')中选择列。您仍然可以在网格视图中引用相关数据,它将只是延迟加载。

如果您的结果集很小,特别是如果您不打算使用分页,请考虑切换到ArrayDataProvider

在您的具体情况下,我建议您只创建另一个hasOne关系,如peopleStatsLast,并在其中实现查询,该查询只为给定的人选择最后一组统计数据,然后延迟加载它。有关更多信息,请查看MySQL参考

票数 1
EN

Stack Overflow用户

发布于 2016-02-25 08:40:13

应该是这个查询

代码语言:javascript
复制
$query = People::find()->
   join('LEFT OUTER JOIN', 'people_state', "people_table_id = people_state_table_id")->
   where("(peopleID, date) in ( select peopleID, max(date) from  peopleStats 
   group by peopleID)");
票数 0
EN

Stack Overflow用户

发布于 2016-02-25 09:12:28

使用这个查询就像.

代码语言:javascript
复制
$query = People::find(); 
$query->join('LEFT OUTER JOIN', 'people_state', "people_table_id = people_state_table_id");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35616732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档