Skip to content

Commit b413d30

Browse files
committed
Feat:add feature WhereHas in db
1 parent 96b2a74 commit b413d30

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

src/QueryFilter/Detection/ConditionsDetect/DB/DBBuilderQueryByCondition.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use eloquentFilter\QueryFilter\Queries\DB\WhereCustom;
1111
use eloquentFilter\QueryFilter\Queries\DB\WhereDate;
1212
use eloquentFilter\QueryFilter\Queries\DB\WhereDoesntHave;
13+
use eloquentFilter\QueryFilter\Queries\DB\WhereHas;
1314
use eloquentFilter\QueryFilter\Queries\DB\WhereIn;
1415
use eloquentFilter\QueryFilter\Queries\DB\WhereLike;
1516
use eloquentFilter\QueryFilter\Queries\DB\WhereOr;
@@ -41,7 +42,7 @@ public function build($condition): ?string
4142
'WhereByOpt' => WhereByOpt::class,
4243
'WhereDate' => WhereDate::class,
4344
'WhereDoesntHave' => WhereDoesntHave::class,
44-
// 'WhereHas' => WhereHas::class,
45+
'WhereHas' => WhereHas::class,
4546
'WhereIn' => WhereIn::class,
4647
'WhereLike' => WhereLike::class,
4748
'WhereOr' => WhereOr::class,

src/QueryFilter/Queries/DB/WhereHas.php

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,45 @@
33
namespace eloquentFilter\QueryFilter\Queries\DB;
44

55
use eloquentFilter\QueryFilter\Queries\BaseClause;
6-
use Illuminate\Database\DB\Builder;
6+
use Illuminate\Database\Query\Expression as Raw;
7+
use Illuminate\Support\Facades\DB;
8+
use Illuminate\Support\Str;
79

810
/**
911
* Class WhereHas.
12+
* Implements WhereHas functionality for DB queries using EXISTS clause
1013
*/
1114
class WhereHas extends BaseClause
1215
{
1316
/**
17+
* Apply the WhereHas condition to the DB query
18+
*
1419
* @param $query
15-
*
16-
* @return Builder
20+
* @return \Illuminate\Database\Query\Builder
1721
*/
1822
public function apply($query)
1923
{
20-
//todo implement later
21-
return ;
24+
$field_row = explode('.', $this->filter);
25+
$field_row = end($field_row);
26+
27+
$relation = str_replace('.'.$field_row, '', $this->filter);
28+
$relationTable = Str::plural($relation);
29+
30+
$value = $this->values;
31+
$from = $query->from;
32+
33+
return $query->whereExists(function ($q) use ($relationTable, $field_row, $value, $from) {
34+
$foreignKey = sprintf('%s.%s_id', $from, Str::singular($relationTable));
35+
36+
$q->select(DB::raw(1))
37+
->from($relationTable)
38+
->whereRaw("$relationTable.id = $foreignKey");
39+
40+
if (is_array($value)) {
41+
$q->whereIn($field_row, $value);
42+
} else {
43+
$q->where($field_row, $value);
44+
}
45+
});
2246
}
2347
}

0 commit comments

Comments
 (0)