-1

I create an extension called material and everything works fine. I want to implement simple search query, so I sampled it from bixie/portfolio extension which you can get it from marketplace. So I have this code in my MaterialController:

$user_id = App::user()->id;
        $query  = array_values(Material::query()->where('user_id = ?', [$user_id])->get());
        $filter = array_merge(array_fill_keys(['search', 'order', 'limit'], ''), $filter);

        extract($filter, EXTR_SKIP);

        if ($search) {
            $query->where(function ($query) use ($search) {  //<-- this throw error.
                $query->orWhere(['name LIKE :search'], ['search' => "%{$search}%"]);
            });
        }

and I will get fatal error:

Fatal error: Call to a member function where() on array in line...

What do the error mean?

I googled a bit and some comment that function where() need to use with collections. How can I resolve it in this case?

I am using pagekit 1.0.12, symfony ~3.0.0.

sooon
  • 4,718
  • 8
  • 63
  • 116

1 Answers1

0

A proper version of code is:

$user_id = App::user()->id;
// init query and add filter by `user_id`
// DO NOT use `get` and `array_values`, because 
// these functions __change__ type of `$query`
$query  = Material::query()->where('user_id = ?', [$user_id]);

$filter = array_merge(array_fill_keys(['search', 'order', 'limit'], ''), $filter);
extract($filter, EXTR_SKIP);

if ($search) {
    // add additional filtering
    $query->where(function ($query) use ($search) {
        $query->orWhere(['name LIKE :search'], ['search' => "%{$search}%"]);
    });
}

// get/return results of a query
return $query->get();
u_mulder
  • 54,101
  • 5
  • 48
  • 64
  • I tried your code and got `500 - internal server error`. but when I tried `$query = Material::query()`, then I get the result. any idea? – sooon Jul 30 '17 at 10:19
  • With filter by `$search` I suppose you need to use `andWhere` – u_mulder Jul 30 '17 at 10:32
  • after many unsuccessful attempts, I go back to old school way: `$query->where('user_id ='.$user_id.' AND name LIKE "'.$search.'%"');` – sooon Jul 30 '17 at 12:49