Jijin P
Jijin P

Reputation: 268

How to use Laravel Eloquent with LIKE statement in array list?

I have some conditions in array like

    $category = Input::get('category');
    $cuisine = Input::get('cuisine');
    $veg = Input::get('veg');
    $trending = Input::get('trending');
    $time = Input::get('time');

    if($category) $conditions['category'] = $category;
    if($cuisine) $conditions['cuisine'] = $cuisine;
    if($veg) $conditions['veg'] = $veg;
    if($trending) $conditions['trending'] = $trending;

How can I make

$list  = Data::where($conditions)->where('cuisine','LIKE','%'.$cuisine.'%')->get();

Is it possible to enter LIKE % in this statement

if($cuisine) $conditions['cuisine'] = $cuisine;

The problem is that if I want to add this where('cuisine','LIKE','%'.$cuisine.'%') several areas it needs to be updated. and in some cases, if cuisine is not present everything cannot be fetched

I want to perform LIKE statement for only cuisine data.

Upvotes: 1

Views: 4233

Answers (5)

Alexey Mezenin
Alexey Mezenin

Reputation: 163768

Sure, you can do that by creating an array with this format:

[['column1', 'like', '%' . $filter1 . '%'], ['column2', 'like', '%' . $filter2 . '%']]

For example:

$fields = ['category', 'cuisine', 'veg', 'trending', 'time'];

foreach ($fields as $field) {
    if ($request->get($field)) {
        $conditions[] = [$field, 'like', '%' . $request->get($field) . '%'];
    }
}

$list = Data::where($conditions)->get();

Another example from the docs:

You may also pass an array of conditions to the where function:

$users = DB::table('users')->where([
    ['status', '=', '1'],
    ['subscribed', '<>', '1'],
])->get();

https://laravel.com/docs/5.5/queries#where-clauses

Update

You've just updated your question and said you want to use like only for $cuisine. In this case, you can use a closure:

->where(function($q) use($request) {
    if ($request->cuisine) {
        $q->where('cuisine', 'like', '%' . $request->cuisine . '%');
    }
})

Or you could use when():

->when($request->cuisine, function ($q) use ($cuisine) {
    return $q->where('cuisine', 'like', '%' . $request->cuisine . '%');
})

Upvotes: 5

fazalerabbi
fazalerabbi

Reputation: 173

Well, you have to assign query to some variable:

    $query = Data::where($conditions);
     if($cuisine) { 
    $query = $query->where('cuisine','LIKE','%'.$cuisine.'%'); 
    } 
$list = $query->get();

Upvotes: 0

freelancer
freelancer

Reputation: 1164

Why not just assign as blank value as default as it will pass in LIKE for all cases

$conditions['cuisine']= (isset($cuisine)&&$cuisine)) ? $cuisine : '';

Upvotes: 0

Sagar Gautam
Sagar Gautam

Reputation: 9369

You can do it like,

$query = DB::table('data');

$category = Input::get('category');
$cuisine = Input::get('cuisine');
$veg = Input::get('veg');
$trending = Input::get('trending');
$time = Input::get('time');

if($category) {
    $query->where('category','LIKE','%'.$category.'%');
}
if($cuisine) {
    $query->where('cuisine','LIKE','%'.$cuisine.'%');
}
if($veg) {
    $query->where('veg','LIKE','%'.$veg.'%');
}
if($trending) {
    $query->where('trending','LIKE','%'.$trending.'%');
}
if($time) {
    $query->where('time','LIKE','%'.$time.'%');
}

$list = $query->get();

I hope you will understand.

Upvotes: 0

Amarnasan
Amarnasan

Reputation: 15529

Well, you can do it in parts:

$query = Data::where($conditions);
if($cuisine) {
    $query->where('cuisine','LIKE','%'.$cuisine.'%');
}
$list = $query->get();

Upvotes: 1

Related Questions