Как сделать фильтрацию поиска по коллекции массивов? - PullRequest
0 голосов
/ 21 декабря 2018

Я собираюсь построить функцию расширенного поиска в laravel 5. Я запросил из таблицы 'itemregistrations', отфильтровав несколько полей, таких как negeriID, categoryID и operasiID.Мне нужно сделать массив карт, чтобы рассчитать возрастное значение каждого элемента и положить в массив.Получение значений с использованием таблицы регистрации элементов и расчета возраста работает нормально, но это затрудняет поиск в операторе if.Он не может искать и получать значения через массив в коллекции.

   $newitem = DB::table('itemregistrations')
        ->select('itemregistrations.*')
        ->get();

    //added code to get 'age' value:
    $newitem->map(function ($detail) {

        $detail->age = \Carbon\Carbon::createFromFormat('Y',$detail->lahir_yy)->diffInYears(); 
        return $detail;
    });   


    if ($request->has('negeri_lahir')) {
        $newitem->where('NegeriID', '==', $request->negeri_lahir);
    }

    if ($request->has('kategori')) {
        $newitem->where('CategoryID', $request->kategori);
    }

    if ($request->has('pangkat')) {
        $newitem->where('OperasiID', $request->pangkat);
    }

   dd($newitem->get()); 

Проблема из-за добавления карты массива, превращая коллекцию в значения массива, вызывая эту ошибку.Выдает ошибку:

 Type error: Too few arguments to function Illuminate\Support\Collection::get(), 0 passed in C:\xampp\htdocs\

Это список массивов в коллекции для dd ($ newitem);

 #items: array:1123 [▼
0 => {#709 ▶}
1 => {#680 ▶}
2 => {#681 ▶}
3 => {#712 ▶}

Collection {#671 ▼
#items: array:1123 [▼
0 => {#709 ▼
  +"ItemRegistrationID": 1
  +"COID": 109064
  +"FType": ""
  +"STNo": "0"
  +"RegistrationDate": "2005-12-01"
  and more attributes...

Как включить поиск по списку массивов?

1 Ответ

0 голосов
/ 21 декабря 2018
  1. Прежде всего, вам не нужно использовать select() в запросе.
  2. Похоже, лучше сделать фильтрацию в запросе базы данных, используя when().

Попробуйте:

$newitem = DB::table('itemregistrations')
    ->when(request('age'), function($query){
        $query->whereRaw('YEAR(curdate()) - lahir_yy >= ?', [request('age')]);
    })
    ->when(request('negeri_lahir'), function($query){
        $query->where('NegeriID', request('negeri_lahir'));
    })
    ->when(request('kategori'), function($query){
        $query->where('CategoryID', request('kategori'));
    })
    ->when(request('pangkat'), function($query){
        $query->where('OperasiID', request('pangkat'));
    })
    ->get();
...