2014-09-03 66 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); 

或者你可以輕鬆地把整個事情放入一個函數。