具有追加函数和传递参数的Laravel模型

时间:2016-07-29 19:00:07

标签: php mysql laravel eloquent

所以我有一个& * ^%的时间用这个。我已经做了一些挖掘,我似乎无法找到正确(或可能)的方式来完成我正在寻找的东西。

有点背景故事。我已将此查询编写为直接与nv3d图库集成,因此数据结构对我来说如此重要以及正确确定日期范围的原因。

首先我们对" Products"进行了模型查询,这为我创建了一个包含id,title和color的漂亮有序列表。

Product::whereCuId(auth()->user()->cu_id)
        ->whereCategoryId($id)
        ->orderBy('sort_order', 'ASC')
        ->select('id as id','title AS key', 'color AS color')
        ->get();

返回以下内容。

{
"id": 1,
"key": "Title 1",
"color": "#ffbd13",
}
{
"id": 2,
"key": "Title 2",
"color": "#8f8f8f"
}
(etc)

第一步:太棒了!

接下来在Product模型中,我将日期/值附加到每个产品。这就是问题所在。

如何将参数传递给此次要查询,如日期计数,范围等?!

protected $appends = array('values');
    public function getValuesAttribute() {
        return $values=Checkin::whereProductId($this->id)
            ->groupBy('date')
            ->orderBy('date', 'ASC')
            ->whereRaw('Date(created_at) > CURDATE() - INTERVAL 21 day')
            ->get(array(
                DB::raw('1000*UNIX_TIMESTAMP(Date(created_at)) as date'),
                DB::raw('COUNT(id) as total')
            ));
    }

现在很明显我可以使用目前上述查询中的类似内容......

->whereRaw('Date(created_at) > CURDATE() - INTERVAL 21 day') 

但是我怎样才能将参数从初始控制器(调用产品模型)传递到模型内的子函数中,并说...设置上面的" 21"我传入的变量?

先谢谢大家的帮助!!!

这是数据格式的最终​​目标,因为它目前存在(无法更改天数),仅作为示例包含在内。

{
"id": 1,
"key": "Title 1",
"color": "#ffbd13",
"values": [
  {
  "date": 1468047600000,
  "total": 4
  },
  {
  "date": 1468134000000,
  "total": 1
  },
  {
  "date": 1468220400000,
  "total": 1
  },
  {
  "date": 1468306800000,
  "total": 2
  }]
}
{
"id": 2,
"key": "Title 2",
"color": "#8f8f8f"
}
(etc)

1 个答案:

答案 0 :(得分:0)

我猜你在寻找关闭。没有测试,但应该给你的想法:

$yourVar = 21;
$values=Checkin::whereProductId($this->id)
        ->groupBy('date')
        ->orderBy('date', 'ASC')
        ->where(function ($query) use ($yourVar) {
            $query->whereRaw('Date(created_at) > CURDATE() - INTERVAL '.$yourVar.' day'));
        })
        ->get(array(
            DB::raw('1000*UNIX_TIMESTAMP(Date(created_at)) as date'),
            DB::raw('COUNT(id) as total')
        ));