Skip to content

Commit b644913

Browse files
committed
ignoreSelectsInCountQuery()
1 parent da5ffcd commit b644913

File tree

2 files changed

+74
-2
lines changed

2 files changed

+74
-2
lines changed

src/QueryDataTable.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ class QueryDataTable extends DataTableAbstract
4949
*/
5050
protected bool $keepSelectBindings = false;
5151

52+
/**
53+
* Flag to ignore the selects in count query.
54+
*
55+
* @var bool
56+
*/
57+
public bool $ignoreSelectInCountQuery = false;
58+
5259
/**
5360
* @param QueryBuilder $builder
5461
*/
@@ -159,7 +166,7 @@ public function prepareCountQuery(): QueryBuilder
159166
if ($this->isComplexQuery($builder)) {
160167
$builder->select(DB::raw('1'));
161168

162-
if (! $this->isComplexQuery($builder)) {
169+
if ($this->ignoreSelectInCountQuery || ! $this->isComplexQuery($builder)) {
163170
return $this->getConnection()
164171
->query()
165172
->fromRaw('('.$builder->toSql().') count_row_table')
@@ -801,4 +808,11 @@ public function getFilteredQuery(): QueryBuilder
801808

802809
return $this->getQuery();
803810
}
811+
812+
public function ignoreSelectsInCountQuery()
813+
{
814+
$this->ignoreSelectInCountQuery = true;
815+
816+
return $this;
817+
}
804818
}

tests/Unit/QueryDataTableTest.php

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,58 @@ public function test_complex_query_are_wrapped_and_countable()
3232
$this->assertEquals(60, $dataTable->count());
3333
}
3434

35+
public function test_complex_query_use_select_in_count()
36+
{
37+
/** @var \Yajra\DataTables\QueryDataTable $dataTable */
38+
$dataTable = app('datatables')->of(
39+
DB::table('users')
40+
->select('users.*')
41+
->addSelect([
42+
'last_post_id' => DB::table('posts')
43+
->whereColumn('posts.user_id', 'users.id')
44+
->orderBy('created_at')
45+
->select('id')
46+
])
47+
->orderBy(DB::table('posts')->whereColumn('posts.user_id', 'users.id')->orderBy('created_at')->select('created_at')
48+
)
49+
);
50+
51+
$this->assertQueryHasNoSelect(false, $dataTable->prepareCountQuery());
52+
$this->assertEquals(20, $dataTable->count());
53+
}
54+
55+
public function test_complex_query_can_ignore_select_in_count()
56+
{
57+
/** @var \Yajra\DataTables\QueryDataTable $dataTable */
58+
$dataTable = app('datatables')->of(
59+
DB::table('users')
60+
->select('users.*')
61+
->addSelect([
62+
'last_post_id' => DB::table('posts')
63+
->whereColumn('posts.user_id', 'users.id')
64+
->orderBy('created_at')
65+
->select('id')
66+
])
67+
->orderBy(DB::table('posts')->whereColumn('posts.user_id', 'users.id')->orderBy('created_at')->select('created_at')
68+
)
69+
)->ignoreSelectsInCountQuery();
70+
71+
$this->assertQueryHasNoSelect(true, $dataTable->prepareCountQuery());
72+
$this->assertEquals(20, $dataTable->count());
73+
}
74+
3575
public function test_simple_queries_with_complexe_select_are_wrapped_without_selects()
3676
{
3777
/** @var \Yajra\DataTables\QueryDataTable $dataTable */
3878
$dataTable = app('datatables')->of(
39-
DB::table('users')->select('users.*')->selectRaw('(select id from posts where posts.user_id = users.id order by created_at desc limit 1) as last_post_id')
79+
DB::table('users')
80+
->select('users.*')
81+
->addSelect([
82+
'last_post_id' => DB::table('posts')
83+
->whereColumn('posts.user_id', 'users.id')
84+
->orderBy('created_at')
85+
->select('id')
86+
])
4087
);
4188

4289
$this->assertQueryWrapped(true, $dataTable->prepareCountQuery());
@@ -55,6 +102,17 @@ public function test_simple_queries_are_not_wrapped_and_countable()
55102
$this->assertEquals(20, $dataTable->count());
56103
}
57104

105+
public function test_complexe_queries_can_be_wrapped_and_countable()
106+
{
107+
/** @var \Yajra\DataTables\QueryDataTable $dataTable */
108+
$dataTable = app('datatables')->of(
109+
User::with('posts')->select('users.*')
110+
);
111+
112+
$this->assertQueryWrapped(false, $dataTable->prepareCountQuery());
113+
$this->assertEquals(20, $dataTable->count());
114+
}
115+
58116
/**
59117
* @param $expected bool
60118
* @param $query \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder

0 commit comments

Comments
 (0)