Blame view

app/Queries/Tip/TipQuery.php 2.28 KB
e77200db5   nologostudio.ru   Initial commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  <?php
  
  namespace FootyRoom\Queries\Tip;
  
  use FootyRoom\Support\AutoMapper;
  use FootyRoom\Support\MongoClient;
  
  class TipQuery
  {
      /** @var \FootyRoom\Support\MongoClient */
      protected $mongo;
  
      /** @var array */
      protected $query;
  
      public function __construct(MongoClient $mongo)
      {
          $this->mongo = $mongo;
          $this->query = [
              ['$lookup' => [
                  'from' => 'matches',
                  'localField' => 'matchId',
                  'foreignField' => 'matchId',
                  'as' => 'match',
              ]],
              ['$unwind' => '$match'],
              ['$project' => [
                  'id' => '$_id',
                  'match.homeTeam' => 1,
                  'match.awayTeam' => 1,
                  'match.homeScore' => 1,
                  'match.awayScore' => 1,
                  'match.statusType' => 1,
                  'match.stage' => 1,
                  'match.datetime' => 1,
                  'match.posts' => 1,
                  'match.id' => '$match.matchId',
                  'prediction' => '$prediction',
                  'odds' => '$odds',
                  'status' => '$status',
                  'result' => '$result',
              ]],
              ['$sort' => ['match.datetime' => -1]],
          ];
      }
  
      /**
       * @return \FootyRoom\Queries\Tip\Tip[]
       */
      public function find(int $limit): array
      {
          $query = array_merge(
              $this->query,
              [['$limit' => $limit]]
          );
  
          $tips = $this->search($query);
  
          return $tips;
      }
  
      /**
       * @return \FootyRoom\Queries\Tip\Tip|null
       */
      public function findByMatchId(int $matchId): ?Tip
      {
          $query = array_merge(
              [['$match' => ['matchId' => $matchId]]],
              $this->query
          );
  
          $tips = $this->search($query);
  
          if ($tips) {
              return $tips[0];
          }
  
          return null;
      }
  
      /**
       * @return \FootyRoom\Queries\Tip\Tip[]
       */
      private function search(array $query): array
      {
          $cursor = $this->mongo->footyroom->tips->aggregate($query);
  
          $tips = [];
          foreach ($cursor as $tip) {
              $tip['match']['datetime'] = $tip['match']['datetime']->toDatetime();
              $tips[] = AutoMapper::map($tip, Tip::class);
          }
  
          return $tips;
      }
  }