2014-09-03 97 views
0

我有一个模型叫ProductProduct除了别的以外还有价格,类别和创建日期。如何表示OOP中的平均值和其他聚合值?

我想显示一个表格,显示许多地方按类别划分的平均价格和平均年龄。有时候我只想要一个类别,有时甚至是一切,有时候只有那些已经超过特定时间的产品。

目前我使用Laravel的查询生成器在控制器中生成这些数字,然后传递那看一看。

为了尽量重用,我有这样的方法之前,我需要它:

$product_averages_base_query = DB::table('products') 
    ->leftJoin('categories', 'products.MakeDescription', '=', 'categories.id') 
    ->select(
     DB::raw('count(products.id) as TotalNumber'), 
     DB::raw('AVG(Datediff("'.date('Y-m-d').'",products.created)) as AvgDaysInStock'), 
     DB::raw('AVG(Price) as AvgPrice') 
    ); 

然后,当具体使用情况下,我使用:

$averages = $product_averages_base_query->where('categories.name', '=', 'Example 1')->get(); 

或任何变种是。

这种感觉真的是“错误”,因为我当然最终将这些代码复制到各处。

如何以一种让我更容易重用它的方式表示这些数据?我应该上课吗?它应该叫什么,它有什么?

我应该有一个模型莫名其妙?

欢迎任何建议!

回答

0

至于适当的地方,你可以很容易地使用查询范围和放下你的模型中的一切。你可能会想开始与你的基本查询......

public function scopeBaseQuery($query) 
{ 
    return $query->leftJoin('categories', 'products.MakeDescription', '=', 'categories.id') 
     ->select(
      DB::raw('count(products.id) as TotalNumber'), 
      DB::raw('AVG(Datediff("'.date('Y-m-d').'",products.created)) as AvgDaysInStock'), 
      DB::raw('AVG(Price) as AvgPrice') 
     ); 
} 

,然后继续类别名称范围...

public function scopeOfName($query, $name) 
{ 
    return $query->where('categories.name', $name); 
} 

添加额外的范围,因为你需要。

然后利用这一点,那将是很容易的......

$averages = Product::baseQuery()->ofName('Example 1')->get(); 
+0

这是否有意义,因为它不是产品的属性,它是所有产品的属性? – 2014-09-03 16:14:13

0

一个解决办法是创建模型雄辩类,然后把功能集成到一个范围。

class Product extends Eloquent { 

    public function scopeAveragesByCategoryName($q, $catName) { 
     return $q->leftJoin('categories', 'products.MakeDescription', '=', 'categories.id') 
       ->select(DB::raw('count(products.id) as TotalNumber'), 
          DB::raw('AVG(Datediff("'.date('Y-m-d').'",products.created)) as AvgDaysInStock'), 
          DB::raw('AVG(Price) as AvgPrice')) 
       ->where('categories.name', '=', $catName); 
    } 

} 

$products = Product::averagesByCategoryName('Example 1')->get(); 
var_dump($products); 

或者你可以轻松地把整个事情放入一个函数。