Yii2 gridview显示的记录多于表

时间:2016-02-25 01:45:46

标签: yii2

我有两个mysql表:

,共有51条记录

  
      
  • ID
  •   
  • 名称
  •   
  • ...
  •   

人员统计,包含131条记录

  
      
  • ID
  •   
  • 的peopleid
  •   
  • 日期
  •   
  •   
  • ...
  •   

如果我在models / peopleSearch.php中设置它

$query->joinWith('peopleStats');

GridView显示131条记录。我如何设置该连接只是为每个人项目获取最后一天的记录(MAX(日期)的查询),GridView只显示包含最新数据的51条记录?

由于

3 个答案:

答案 0 :(得分:1)

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

现在,您已在查询中引入了JOIN。这会增加结果集中的行数(在您的情况下从51到131)。总模型数不是唯一中断的,你也应该有分页问题。请注意,您可能用于获取所有模型的all()函数(如People::find()->joinWith('peopleStats')->all()中的功能足够智能,可以删除多余的行,因此您将获得具有all()的51个模型。

现在,有几种解决方法。首先,在数据提供程序中执行joinWith()的唯一原因是您需要对相关数据进行筛选或排序。如果不是这种情况,请使用with(),你会没事的。

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

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

在您的具体情况下,我建议您创建另一个hasOne关系,例如peopleStatsLast,并在其中实现仅选择给定人员的最后一组统计信息的查询,然后延迟加载它。查看MySQL reference了解详情。

答案 1 :(得分:0)

应该是这个查询

$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)");

答案 2 :(得分:0)

使用此查询,如.....

$query = People::find(); 
$query->join('LEFT OUTER JOIN', 'people_state', "people_table_id = people_state_table_id");