2015-09-06 45 views
3

我有一个laravel 4.2应用程序,但我想展示一些统计...Laravel 4.2静态函数不返回正确的值

所以我想告诉游客人数最多等等

我得到这个:

与此代码里面它叫Stats类:

public static function MostVisits() 
    { 
     return Tracker::selectRaw('count(*), date')->groupBy('date')->orderBy('count(*)', 'desc')->first(); 
    } 

这工作就像一个魅力,当我执行渲染代码(select count(*), date from protrack group by date order by count(*)desc limit 1)在我的SQL Server中,它给出了正确的值。

现在我想要得到的一切:

Stats::MostVisits()->count('*')站在我的看法,但给我的在表中的所有记录的计数......

但具体日期date('d/m/Y', strtotime(Stats::MostVisits()->date))确实返回了很大一部分。 ..那么,我该如何解决计数问题?

+0

通过使用Stats :: MostVisits() - > count('*'),您明确地告诉函数显示所有记录的计数。创建一个变量$ track = Tracker :: selectRaw .........并返回$ track,然后使用MostVisits()获取所有内容。 –

+0

因此,不可能使用与日期相同的函数进行计数? – Robin

+0

或者我需要返回一个变量而不是查询?因为答案有点奇怪... – Robin

回答

0

通过添加一个foreach,我能够解决它。

所以控制器方法是现在:

public static function CountMostVisits() 
    { 
     $json = Tracker::selectRaw('count(*)')->groupBy('date')->orderBy('count(*)', 'desc')/*->remember(1440)*/->first(); 
     $array = json_decode($json, true); 
     return $array; 
    } 

正如你所看到的,它返回JSON,至极需要被解码。

,那么该观点:

@foreach(Stats::CountMostVisits() as $stat) 
      {{ $stat }}, op {{ date('d/m/Y', strtotime(Stats::MostVisits()->date)) }}.</p> 
      @endforeach 

这解决了该问题对我来说。

0

您遇到的问题是因为您在查询结束时有->first()

通过添加->first(),您已更改您的MostVisits()函数返回的内容。

在致电first()之前,您有一个Eloquent查询对象。如果调用count(),确实会将查询更改为计数查询。

但是,在调用first()后,您拥有的不再是一个Eloquent查询对象。相反,它是包含从查询返回的第一条记录的Tracker的实例。拨打电话count()就好像您拨打Tracker::count()一样,它会给您所有记录的计数。

解决方法是从MostVisits方法中删除->first()部分,然后将其移至您调用MostVisits()的地方。

然后,您将可以按照预期使用MostVisitscount(),或者确实可以使用任何其他查询修改方法。