Laravel hasManyThrough在日期

时间:2016-05-20 17:12:58

标签: php sql laravel eloquent

我有可以通过用户查看视图的模型。我已经设置了这样的模型:

public function views()
{
  return $this->hasManyThrough('App\View', 'App\User');
}

在我的控制器中,我将json数据发送到图表,对于每个模型的对象,如下所示:

public function barCharts(Request $request){
    $modelName = 'App\\'.$request['option'];
    $model = new $modelName;

    foreach($model->all() as $val){
      $modelViews[$val->name] = $val->views->count();
    }

    return json_encode($modelViews);
  }

例如,我的Chain模型在DB中有3个链,通过这个函数我得到每个链的视图数。 这一切都很好,但现在我需要得到那些数据,我将从$from = $request['from']; $to = $request['to'];得到的时间间隔

所以,基本上,我需要的是这样的东西:

$modelViews[$val->name] = $val->views->whereBetween('created_at', [$from, $to])->count();

我想知道是否有任何优雅的解决方案以及如何解决这个问题,或者我将不得不使用一些SQL查询。

更新了代码

我还必须向whereBetween子句添加一个表,因为它给了我一个错误:

  

SQLSTATE [23000]:完整性约束违规:1052列   ' created_at' in where子句不明确

所以,这就是我最终的工作方式:

foreach($model->all() as $val){
      $modelViews[$val->name] = $val->views()->whereBetween('views.created_at', [$from.' 00:00:00', $to.' 00:00:00'])->count();
    }

1 个答案:

答案 0 :(得分:1)

您的代码中只有一个小错字(或误解)。您在$val->views之后缺少()

$modelViews[$val->name] = $val->views()->whereBetween('created_at', [$from, $to])->count();

当您致电时 - > gt;视图Laravel已从数据库中提取数据。当您调用 - > views()时,您将获得一个可以进一步修改的查询对象。

您还必须确保日期的格式如下:YYYY-mm-dd HH:mm:ss,以便它们与created_at列匹配。