php - whereraw - laravel資料庫設定




Laravel Eloquent按天分組結果 (9)

你可以使用Carbon(集成在Laravel中)

// Carbon
use Carbon\Carbon;   
$visitorTraffic = PageView::select('id', 'title', 'created_at')
    ->get()
    ->groupBy(function($date) {
        return Carbon::parse($date->created_at)->format('Y'); // grouping by years
        //return Carbon::parse($date->created_at)->format('m'); // grouping by months
    });

我目前有一個page_views表,每次訪問者訪問一個頁面時記錄一行,記錄用戶的ip / id和頁面本身的id。 我應該補充一點,created_at列的類型為:timestamp,因此它包含小時/分鐘/秒。 當我嘗試groupBy查詢時,由於秒差異,它不會將相同的日期組合在一起。

created_at         page_id       user_id
==========         =======       =======
10-11-2013            3            1
10-12 2013            5            5
10-13 2013            5            2
10-13 2013            3            4
  ...                ...          ...

我想根據觀點/日得到結果,所以我可以得到類似的結果:

  date          views
  ====          =====
10-11-2013       15
10-12 2013       45
  ...            ...

我想我需要深入研究DB :: raw()查詢才能實現這一目標,但任何見解都會有很大幫助,謝謝

編輯:添加了created_at格式的說明。


使用不含碳的Laravel 4.2

以下是我抓住最近十天的情況,併計算每天create_at時間戳的每一行。

$q = Spins::orderBy('created_at', 'desc')
->groupBy(DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d')"))
->take(10)
->get(array(
      DB::raw('Date(created_at) as date'),
      DB::raw('COUNT(*) as "views"')
  ));


foreach ($q as $day) {

  echo $day->date. " Views: " . $day->views.'<br>';

}

希望這可以幫助


在mysql中,您可以添加MONTH關鍵字,將時間戳作為laravel中的參數,您可以這樣做

Payement::groupBy(DB::raw('MONTH(created_at)'))->get();

您可以使用mysql根據格式化日期過濾結果( 請參閱此處獲取Mysql / Mariadb幫助 )並在laravel-5.4中使用類似的內容:

Model::selectRaw("COUNT(*) views, DATE_FORMAT(created_at, '%Y %m %e') date")->groupBy('date')->get();

我就是這樣做的。 一個簡短的例子,但使我的查詢更易於管理

$visitorTraffic = PageView::where('created_at', '>=', \Carbon\Carbon::now->subMonth())
                        ->groupBy(DB::raw('Date(created_at)'))
                        ->orderBy('created_at', 'DESC')->get();

我有同樣的問題,我現在正在使用Laravel 5.3。

我用DATE_FORMAT()

->groupBy(DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d')"))

希望這會對​​你有所幫助。


我相信我找到了一個解決方案,關鍵是mysql中的DATE()函數,它將DateTime轉換為日期:

DB::table('page_views')
      ->select(DB::raw('DATE(created_at) as date'), DB::raw('count(*) as views'))
      ->groupBy('date')
      ->get();

但是,這不是一個真正的Laravel Eloquent解決方案,因為這是一個原始查詢。以下是我在Eloquent-ish語法中提出的。 第一個where子句使用碳日期進行比較。

$visitorTraffic = PageView::where('created_at', '>=', \Carbon\Carbon::now->subMonth())
                            ->groupBy('date')
                            ->orderBy('date', 'DESC')
                            ->get(array(
                                DB::raw('Date(created_at) as date'),
                                DB::raw('COUNT(*) as "views"')
                            ));

我知道這是一個老問題,有多個答案。 根據文檔和我在laravel上的經驗,如何處理事物的良好“雄辯的方式”

在你的模型中,像這樣添加一個mutator / Getter

public function getCreatedAtTimeAttribute()
{
   return $this->created_at->toDateString();
}

另一種方法是在模型中強制轉換列,填充$cast數組

$casts = [
   'created_at' => 'string'
]

這裡的問題是你不能再在這個模型上使用Carbon,因為Eloquent總是將列轉換為字符串

希望能幫助到你 :)


警告:未經測試的代碼。

$dailyData = DB::table('page_views')
    ->select('created_at', DB::raw('count(*) as views'))
    ->groupBy('created_at')
    ->get();




laravel-4