Skip to content

Commit

Permalink
Fix and document "whereLike" macro wich only work on Eloquent Query
Browse files Browse the repository at this point in the history
Builder
  • Loading branch information
forxer committed Jun 30, 2019
1 parent 753a24c commit 85adce9
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 6 deletions.
5 changes: 5 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
Changelog
=========

2.2.1 (2019-06-30)
------------------

- Fix and document "whereLike" macro wich only work on Eloquent Query Builder

2.2.0 (2019-04-30)
------------------

Expand Down
4 changes: 3 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,10 +160,12 @@ class User extends Model
}
```

### Query builder whereLike macro
### Eloquent Query builder whereLike macro

Source : https://murze.be/searching-models-using-a-where-like-query-in-laravel

**Warning!** This only works correctly on instances of the *Eloquent Query Builder*, not on the generic Query Builder.

A replacement of this:

```php
Expand Down
11 changes: 6 additions & 5 deletions src/query-builder-macros.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use Illuminate\Database\Query\Builder as QueryBuilder;
use Illuminate\Database\Eloquent\Builder as EloquentQueryBuilder;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;

Expand Down Expand Up @@ -29,20 +30,20 @@ function($column, $direction = 'asc') {
);

// Add an Eloquent "whereLike" query builder macro
QueryBuilder::macro('whereLike', function ($attributes, $searchTerm) {
EloquentQueryBuilder::macro('whereLike', function ($attributes, $searchTerm) {
$searchTerm = str_replace(' ', '%', $searchTerm);

$this->where(function (QueryBuilder $query) use ($attributes, $searchTerm) {
$this->where(function (EloquentQueryBuilder $query) use ($attributes, $searchTerm) {
foreach (Arr::wrap($attributes) as $attribute) {
$query->when(Str::contains($attribute, '.'),
function (QueryBuilder $query) use ($attribute, $searchTerm) {
function (EloquentQueryBuilder $query) use ($attribute, $searchTerm) {
list($relationName, $relationAttribute) = explode('.', $attribute);

$query->orWhereHas($relationName, function (QueryBuilder $query) use ($relationAttribute, $searchTerm) {
$query->orWhereHas($relationName, function (EloquentQueryBuilder $query) use ($relationAttribute, $searchTerm) {
$query->where($relationAttribute, 'LIKE', "%{$searchTerm}%");
});
},
function (QueryBuilder $query) use ($attribute, $searchTerm) {
function (EloquentQueryBuilder $query) use ($attribute, $searchTerm) {
$query->orWhere($attribute, 'LIKE', "%{$searchTerm}%");
}
);
Expand Down

0 comments on commit 85adce9

Please sign in to comment.