복붙노트

[SQL] Laravel 웅변 get 및 결과 일별로 그룹화

SQL

Laravel 웅변 get 및 결과 일별로 그룹화

저는 현재 사용자의 IP / ID와 페이지 자체의 ID를 기록, 방문자가 페이지에 액세스 할 때마다 하나 개의 행을 기록 PAGE_VIEWS의 테이블을 가지고있다. 그것은 시간 / 분 / 초를 포함하므로, 타임 스탬프 : 나는 created_at 열 유형의 것을 추가해야합니다. 내가 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 파고해야합니다 생각하고 있지만 어떤 통찰력이 크게 도움이 될 것이다

편집 : created_at 형식의 추가 설명.

해결법

  1. ==============================

    1.나는 키가 단지 날짜로 날짜 시간 변환 MySQL의에서 DATE () 함수이며, 나는이에 대한 해결책을 발견 생각 :

    나는 키가 단지 날짜로 날짜 시간 변환 MySQL의에서 DATE () 함수이며, 나는이에 대한 해결책을 발견 생각 :

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

    이 원시 query.The의 다음 나는 웅변 틱 구문 해낸 것입니다 때문에, 이것은 Laravel 웅변 솔루션은 정말 없습니다. 절에서 사용하는 탄소 날짜를 비교할 경우 첫 번째.

    $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"')
                                ));
    
  2. ==============================

    2.당신은 탄소를 사용할 수 있습니다 (Laravel에 통합)

    당신은 탄소를 사용할 수 있습니다 (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
        });
    
  3. ==============================

    3.여기에 내가 그것을 할 방법이다. 짧은 예,하지만 훨씬 더 관리 내 쿼리를 만든

    여기에 내가 그것을 할 방법이다. 짧은 예,하지만 훨씬 더 관리 내 쿼리를 만든

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

    4.당신은 MySQL을 사용 포맷 된 날짜를 기준으로 결과를 필터링 할 수 있습니다 및 laravel-5.4에서이 같이 사용 무언가 (MySQL은 / ​​Mariadb 도움 여기를 참조하십시오) :

    당신은 MySQL을 사용 포맷 된 날짜를 기준으로 결과를 필터링 할 수 있습니다 및 laravel-5.4에서이 같이 사용 무언가 (MySQL은 / ​​Mariadb 도움 여기를 참조하십시오) :

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

    5.나는 현재 Laravel 5.3을 사용하고, 같은 문제가 없었다.

    나는 현재 Laravel 5.3을 사용하고, 같은 문제가 없었다.

    내가) (DATE_FORMAT를 사용

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

    희망이 당신을 도울 것입니다.

  6. ==============================

    6.

    PageView::select('id','title', DB::raw('DATE(created_at) as date'))
              ->get()
              ->groupBy('date');
    
  7. ==============================

    7.대부분의 데이터베이스 문제와 마찬가지로, 그들은 데이터베이스를 사용하여 해결해야한다.

    대부분의 데이터베이스 문제와 마찬가지로, 그들은 데이터베이스를 사용하여 해결해야한다.

    당신은에 의해 그룹에 원하는 데이터를 저장하고이 문제를 해결하기 위해 효율적이고 명확한 방법을 달성 할 수있는 인덱스를 사용하여.

        $table->tinyInteger('activity_year')->unsigned()->index();
        $table->smallInteger('activity_day_of_year')->unsigned()->index();
    
    <?php
    
    namespace App\Models;
    
      use DB;
      use Carbon\Carbon;
      use Illuminate\Database\Eloquent\Model;
    
      class PageView extends Model
      {
      public function scopePerDay($query){
    
         $query->groupBy('activity_year');
         $query->groupBy('activity_day_of_year');
    
         return $query;
    
      }
    
      public function setUpdatedAt($value)
      {   
        $date = Carbon::now();
    
        $this->activity_year = (int)$date->format('y');
        $this->activity_day_of_year = $date->dayOfYear;
    
        return parent::setUpdatedAt($value);
     }
    
       $viewsPerDay = PageView::perDay()->get();
    
  8. ==============================

    8.그룹 데이터 대신 DATETIME의 날짜에 따라, 당신은 CAST 기능을 사용할 수 있습니다.

    그룹 데이터 대신 DATETIME의 날짜에 따라, 당신은 CAST 기능을 사용할 수 있습니다.

    $visitorTraffic = PageView::select('id', 'title', 'created_at')
    ->get()
    ->groupBy(DB::raw('CAST(created_at AS DATE)'));
    
  9. ==============================

    9.경고 : 테스트되지 않은 코드입니다.

    경고 : 테스트되지 않은 코드입니다.

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

    10.나는이 오래된 질문이고, 복수 응답가 알고있다. 어떻게 이제까지 문서 및 laravel에 내 경험 아래 좋은 일들을 처리 "웅변 방법이"에 따라

    나는이 오래된 질문이고, 복수 응답가 알고있다. 어떻게 이제까지 문서 및 laravel에 내 경험 아래 좋은 일들을 처리 "웅변 방법이"에 따라

    모델,이 같은 뮤 테이터 / 게터를 추가

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

    또 다른 방법은 열을 캐스팅하는 것입니다 모델에서 $ 캐스트 배열을 채 웁니다

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

    여기 캐치는 웅변은 항상 문자열로 열을 던져 때문에 다시이 모델에 탄소를 사용할 수 없다는 점입니다

    희망이 도움이 :)

  11. ==============================

    11.탄소없이 Laravel 4.2을 사용하여

    탄소없이 Laravel 4.2을 사용하여

    저는 여기에 최근 십일 잡고 당일 created_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>';
    
    }
    

    도움이 되었기를 바랍니다

  12. ==============================

    12.MySQL의에서 당신은 MONTH 매개 변수로 타임 스탬프를 가진 키워드에 추가 할 수 있습니다 laravel에서이 같은 그것을 할 수 있습니다

    MySQL의에서 당신은 MONTH 매개 변수로 타임 스탬프를 가진 키워드에 추가 할 수 있습니다 laravel에서이 같은 그것을 할 수 있습니다

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

    13.내가 통계를 만들기위한 laravel 패키지를 구축 : https://github.com/Ifnot/statistics

    내가 통계를 만들기위한 laravel 패키지를 구축 : https://github.com/Ifnot/statistics

    정말 쉽게 사용할 수 있도록이 웅변, 탄소와 지표를 기반으로합니다. 이 날짜 그룹화 지표의 추출에 유용 할 수있다.

    $statistics = Statistics::of(MyModel::query());
    
    $statistics->date('validated_at');
    
    $statistics->interval(Interval::$DAILY, Carbon::createFromFormat('Y-m-d', '2016-01-01'), Carbon::now())
    
    $statistics->indicator('total', function($row) {
        return $row->counter;
    });
    
    $data = $statistics->make();
    
    echo $data['2016-01-01']->total;
    

    ```

  14. ==============================

    14.당신은 또한 다음과 같은 방법으로이 문제를 해결할 수 :

    당신은 또한 다음과 같은 방법으로이 문제를 해결할 수 :

    $totalView =  View::select(DB::raw('Date(read_at) as date'), DB::raw('count(*) as Views'))
            ->groupBy(DB::raw('Date(read_at)'))
            ->orderBy(DB::raw('Date(read_at)'))
            ->get();
    
  15. from https://stackoverflow.com/questions/20603075/laravel-eloquent-get-results-grouped-by-days by cc-by-sa and MIT license