Analytics.php
40 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP_SCOPED\IAWP\Public_API; |
| 4 | |
| 5 | use IAWP_SCOPED\IAWP\Date_Range\Date_Range; |
| 6 | use IAWP_SCOPED\IAWP\Illuminate_Builder; |
| 7 | use IAWP_SCOPED\IAWP\Query; |
| 8 | use IAWP_SCOPED\Illuminate\Database\Query\JoinClause; |
| 9 | /** @internal */ |
| 10 | class Analytics |
| 11 | { |
| 12 | public $views; |
| 13 | public $visitors; |
| 14 | public $sessions; |
| 15 | private function __construct($row) |
| 16 | { |
| 17 | $this->views = $row->views ?? 0; |
| 18 | $this->visitors = $row->visitors ?? 0; |
| 19 | $this->sessions = $row->sessions ?? 0; |
| 20 | } |
| 21 | /** |
| 22 | * @param Date_Range $date_range |
| 23 | * |
| 24 | * @return self |
| 25 | */ |
| 26 | public static function for(Date_Range $date_range) : self |
| 27 | { |
| 28 | $resources_table = Query::get_table_name(Query::RESOURCES); |
| 29 | $views_table = Query::get_table_name(Query::VIEWS); |
| 30 | $sessions_table = Query::get_table_name(Query::SESSIONS); |
| 31 | $resource_statistics_query = Illuminate_Builder::get_builder(); |
| 32 | $resource_statistics_query->selectRaw('COUNT(DISTINCT views.id) AS views')->selectRaw('COUNT(DISTINCT sessions.visitor_id) AS visitors')->selectRaw('COUNT(DISTINCT sessions.session_id) AS sessions')->from("{$views_table} as views")->join("{$resources_table} AS resources", function (JoinClause $join) { |
| 33 | $join->on('resources.id', '=', 'views.resource_id'); |
| 34 | })->join("{$sessions_table} AS sessions", function (JoinClause $join) { |
| 35 | $join->on('sessions.session_id', '=', 'views.session_id'); |
| 36 | })->whereBetween('views.viewed_at', [$date_range->iso_start(), $date_range->iso_end()]); |
| 37 | return new self($resource_statistics_query->get()->first()); |
| 38 | } |
| 39 | } |
| 40 |