ModelQueryBuilder.php
2.76 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
/**
* @license GPL-3.0-or-later
*
* Modified by learndash on 06-June-2023 using Strauss.
* @see https://github.com/BrianHenryIE/strauss
*/
namespace StellarWP\Learndash\StellarWP\Models;
use InvalidArgumentException;
use StellarWP\Learndash\StellarWP\DB\DB;
use StellarWP\Learndash\StellarWP\DB\QueryBuilder\QueryBuilder;
use StellarWP\Learndash\StellarWP\DB\QueryBuilder\Clauses\RawSQL;
use StellarWP\Learndash\StellarWP\Models\Model;
/**
* @since 1.0.0
*/
class ModelQueryBuilder extends QueryBuilder {
/**
* @var class-string<Model>
*/
protected $model;
/**
* @param class-string<Model> $modelClass
*/
public function __construct( string $modelClass ) {
if ( ! is_subclass_of( $modelClass, Model::class ) ) {
throw new InvalidArgumentException( "$modelClass must be an instance of " . Model::class );
}
$this->model = $modelClass;
}
/**
* Returns the number of rows returned by a query
*
* @since 1.0.0
*
* @param null|string $column
*/
public function count( $column = null ) : int {
$column = ( ! $column || $column === '*' ) ? '1' : trim( $column );
if ( '1' === $column ) {
$this->selects = [];
}
$this->selects[] = new RawSQL( 'SELECT COUNT(%1s) AS count', $column );
return +parent::get()->count;
}
/**
* Get row
*
* @since 1.0.0
*
* @param string $output
*
* @return Model|null
*/
public function get( $output = OBJECT ) : ?Model {
$row = DB::get_row( $this->getSQL(), OBJECT );
if ( ! $row ) {
return null;
}
return $this->getRowAsModel( $row );
}
/**
* Get results
*
* @since 1.0.0
*
* @return Model[]|null
*/
public function getAll( $output = OBJECT ) : ?array {
$results = DB::get_results( $this->getSQL(), OBJECT );
if ( ! $results ) {
return null;
}
if ( isset( $this->model ) ) {
return $this->getAllAsModel( $results );
}
return $results;
}
/**
* Get row as model
*
* @since 1.0.0
*
* @param object|null $row
*
* @return Model|null
*/
protected function getRowAsModel( $row ) {
$model = $this->model;
if ( ! method_exists( $model, 'fromQueryBuilderObject' ) ) {
throw new InvalidArgumentException( "fromQueryBuilderObject missing from $model" );
}
return $model::fromQueryBuilderObject( $row );
}
/**
* Get results as models
*
* @since 1.0.0
*
* @param object[] $results
*
* @return Model[]|null
*/
protected function getAllAsModel( array $results ) {
/** @var Contracts\ModelCrud $model */
$model = $this->model;
if ( ! method_exists( $model, 'fromQueryBuilderObject' ) ) {
throw new InvalidArgumentException( "fromQueryBuilderObject missing from $model" );
}
return array_map( static function( $object ) use ( $model ) {
return $model::fromQueryBuilderObject( $object );
}, $results );
}
}