Skip to content

Commit dfd537a

Browse files
committed
update searchable trait
1 parent 69e3b9c commit dfd537a

File tree

3 files changed

+93
-2
lines changed

3 files changed

+93
-2
lines changed

stubs/modules/Support/Traits/Searchable.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,12 @@ public function scopeSearch(Builder $query, ?string $searchColumn, ?string $sear
1313
{
1414
$searchTerm = preg_replace('/[^A-Za-z0-9 ]/', '', $searchTerm);
1515

16-
$query->when($searchTerm, function ($query, $searchTerm) use ($searchColumn) {
17-
$query->where($searchColumn, 'like', "%{$searchTerm}%");
16+
$columns = array_map('trim', explode(',', $searchColumn));
17+
18+
$query->when($searchTerm, function ($query, $searchTerm) use ($columns) {
19+
foreach ($columns as $column) {
20+
$query->orWhere($column, 'like', "%{$searchTerm}%");
21+
}
1822
});
1923
}
2024
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
use Modules\Support\Traits\Searchable;
4+
use Illuminate\Database\Eloquent\Model;
5+
use Modules\User\Models\User;
6+
7+
uses(Searchable::class);
8+
9+
beforeEach(function () {
10+
$this->user = User::factory()->create([
11+
'name' => 'John Doe',
12+
'email' => 'doe@gmail.com',
13+
'password' => 'secret',
14+
]);
15+
});
16+
17+
afterEach(function () {
18+
$this->user->delete();
19+
});
20+
21+
it('returns empty collection if no result is found', function () {
22+
$result = User::search('name,email', 'Jane')->get();
23+
24+
expect($result)->toHaveCount(0);
25+
});
26+
27+
it('can search a single database column', function () {
28+
$stringToSearch = 'John';
29+
30+
$result = User::search('name', $stringToSearch)->get();
31+
32+
expect($result)->toHaveCount(1);
33+
expect($result->first()->name)->toBe('John Doe');
34+
});
35+
36+
it('can search multiple database columns', function () {
37+
$stringToSearch = 'doe';
38+
39+
$result = User::search('name,email', $stringToSearch)->get();
40+
41+
expect($result)->toHaveCount(1);
42+
expect($result->first()->name)->toBe('John Doe');
43+
});
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
use Modules\Support\Traits\UpdateOrder;
4+
use Illuminate\Database\Eloquent\Model;
5+
use Illuminate\Support\Facades\Schema;
6+
use Illuminate\Database\Schema\Blueprint;
7+
8+
uses(UpdateOrder::class);
9+
10+
beforeEach(function () {
11+
Schema::create('items', function (Blueprint $table) {
12+
$table->id();
13+
$table->string('name')->nullable();
14+
$table->unsignedTinyInteger('order')->nullable();
15+
$table->timestamps();
16+
});
17+
});
18+
19+
afterEach(function () {
20+
Schema::dropIfExists('items');
21+
});
22+
23+
it('can update the order of the model items', function () {
24+
25+
$model = new class extends Model
26+
{
27+
use UpdateOrder;
28+
protected $table = 'items';
29+
protected $guarded = [];
30+
};
31+
32+
$item1 = $model->create(['name' => 'Item 1', 'order' => 0]);
33+
$item2 = $model->create(['name' => 'Item 2', 'order' => 1]);
34+
35+
$newOrder = [
36+
['id' => $item2->id],
37+
['id' => $item1->id]
38+
];
39+
40+
$model->updateOrder($newOrder);
41+
42+
$this->assertEquals(0, $model->find($item2->id)->order);
43+
$this->assertEquals(1, $model->find($item1->id)->order);
44+
});

0 commit comments

Comments
 (0)