Skip to content

Commit f83c9ca

Browse files
author
Sébastien Nikolaou
committed
Create eloquent datatable from relation
1 parent 85a1186 commit f83c9ca

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

src/EloquentDataTable.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Illuminate\Database\Eloquent\Relations\HasOneOrMany;
1010
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
1111
use Illuminate\Database\Eloquent\Relations\MorphTo;
12+
use Illuminate\Database\Eloquent\Relations\Relation;
1213
use Yajra\DataTables\Exceptions\Exception;
1314

1415
/**
@@ -25,16 +26,12 @@ class EloquentDataTable extends QueryDataTable
2526
*/
2627
public function __construct($model)
2728
{
28-
switch ($model) {
29-
case $model instanceof Model:
30-
$builder = $model->newQuery();
31-
break;
32-
case $model instanceof EloquentBuilder:
33-
$builder = $model;
34-
break;
35-
default:
36-
throw new Exception('Invalid model type. Must be an instance of Eloquent Model or Eloquent Builder.');
37-
}
29+
$builder = match (true) {
30+
$model instanceof Model => $model->newQuery(),
31+
$model instanceof Relation => $model->getQuery(),
32+
$model instanceof EloquentBuilder => $model,
33+
default => throw new Exception('Invalid model type. Must be an instance of Eloquent Model, Eloquent Relation, or Eloquent Builder.'),
34+
};
3835

3936
parent::__construct($builder->getQuery());
4037

@@ -100,10 +97,13 @@ protected function compileQuerySearch($query, string $column, string $keyword, s
10097
}
10198

10299
if ($this->isMorphRelation($relation)) {
103-
$query->{$boolean.'WhereHasMorph'}($relation, '*',
100+
$query->{$boolean.'WhereHasMorph'}(
101+
$relation,
102+
'*',
104103
function (EloquentBuilder $query) use ($newColumn, $keyword) {
105104
parent::compileQuerySearch($query, $newColumn, $keyword, '');
106-
});
105+
}
106+
);
107107
} else {
108108
$query->{$boolean.'WhereHas'}($relation, function (EloquentBuilder $query) use ($newColumn, $keyword) {
109109
parent::compileQuerySearch($query, $newColumn, $keyword, '');

tests/Integration/EloquentDataTableTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,17 @@ public function it_can_return_formatted_columns()
121121
$this->assertEquals(Carbon::parse($user->created_at)->format('Y-m-d'), $data['created_at_formatted']);
122122
}
123123

124+
/** @test */
125+
public function it_accepts_a_relation()
126+
{
127+
$user = User::first();
128+
129+
$dataTable = app('datatables')->eloquent($user->posts());
130+
$response = $dataTable->toJson();
131+
$this->assertInstanceOf(EloquentDataTable::class, $dataTable);
132+
$this->assertInstanceOf(JsonResponse::class, $response);
133+
}
134+
124135
protected function setUp(): void
125136
{
126137
parent::setUp();

0 commit comments

Comments
 (0)