TipQuery.php
2.28 KB
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;
}
}