Laravel에서 JSON 열 유형에 대한 고급 검색 및 WHEN 메서드 사용

7823 단어 phpwebdevlaravelmysql
일반 프로그래머로서 사전 검색은 한 번쯤 접하게 되는 일입니다. 최근에 Laravel에서 구현했습니다. 여기에서 설명하겠습니다.

전제 조건 - Laravel Architecture와 모델, 컨트롤러 및 라우팅 작동 방식과 같은 기능에 대한 기본 지식이 있다고 가정합니다.

좋습니다. 이름이 사용자의 생체 데이터를 저장함을 나타내므로 biodata table가 있습니다. 그리고 이것이 마이그레이션이 어떻게 보이는지입니다.

이주

$table->id();
$table->enum('gender',['boy','girl']);
$table->string('name',255);
$table->json('biodata');
$table->timestamps();


보시다시피 JSON 유형인 테이블 열biodata이 있습니다. 이를 통해 db에 JSON을 저장할 수 있습니다. 그리고 attribute casting을 사용하여 가져올 때 자동으로 객체로 변환합니다. 따라서 Biodata 모델은 다음과 같을 것입니다.

모델

namespace App;

use Illuminate\Database\Eloquent\Model;

class Biodata extends Model
{
    protected $guarded = [];

    protected $casts = [
       'biodata' => object
    ];

    protected $perPage = 10;

}



이제 더 진행하기 전에 Biodata 개체가 어떻게 생겼는지 보겠습니다.

공장

return [
            'gender' => $this->faker->randomElement($this->gender),
            'name'=> $this->faker->name(),
            'biodata' => [
                'personal'=>[
                    'qualification' => $this->faker->randomElement($this->qualification),
                    'height'=>$this->faker->randomElement($this->height),
                    'income'=>$this->faker->numberBetween(100000,1000000),
                    'occupation' => $this->faker->randomElement($this->jobs),
                ],
                'family'=>[
                    'father_gotra' => $this->faker->randomElement($this->gotra),
                    'mother_gotra' => $this->faker->randomElement($this->gotra),
                ],
                'contact'=>[
                    'state' => $this->faker->randomElement($this->indianStates),
                ]
            ],
        ];



그리고 이 모든 필드에 대해 검색을 실행할 것입니다.
이제 검색 기능에서 무엇을 얻고자 하는지 논의할 때입니다. 여기에 모든 선택적 검색 매개변수가 있습니다.
  • 성별
  • 단일 값
  • 필드 유형 - ENUM

  • 자격
  • 여러 값일 수 있음
  • 필드 유형 - JSON 키

  • 최소 높이
  • 단일 값
  • 필드 유형 - JSON 키

  • 소득
  • 단일 값
  • 필드 유형 - JSON 키

  • 직업
  • 단일 값
  • 필드 유형 - JSON 키

  • 고트라
  • 다중 값
  • 필드 유형 - JSON 키


  • 이제 이것은 매우 간단해 보일 수 있습니다. where 명령문만 사용하면 됩니다. 하지만 괜찮을 것입니다. 하지만 말을 잡고 몇 가지 명백한 문제를 먼저 살펴보겠습니다.

    Searching in JSON field ?



    그러면 JSON에서 어떻게 검색할까요? 분명히 MYSQL에서는 어렵지 않고 Laravel에서는 더 좋습니다. 간단히 말해서 이것은 키가 제공된 JSON 필드에서 검색하는 방법입니다.

    return $query->where('biodata->personal->income', '>=', $minIncome);
    
    


    이해하려면 위의 Biodata 개체를 확인하십시오.

    Multiple Values



    이제 검색 기능을 작성하기 위해 코드로 뛰어들기 전에 한 가지 질문은 쿼리 문자열에 여러 값을 보내는 방법입니다. 질문해 주셔서 감사합니다. 간단히 이렇게 쉼표로 추가하겠습니다.

    http:://url.com/?qualification=MBA,BA&gender=boy 
    


    이제 ","를 사용하여 간단히 분해할 수 있으며 해당 매개변수에 대한 값 배열을 제공합니다.

    How to add multiple queries to where statements ?



    따라서 이것은 Laravel 문서의 표준 where 문입니다.

    DB::table('users')->where('votes', 100)->get();
    


    그리고 우리는 더 나은 것을 가지고 있습니다.

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


    여기에서 where 문에 여러 인수를 추가할 수 있습니다.
    그러나 실제로 쿼리를 실행하기 전에 일종의 유효성 검사가 필요합니다. 모든 매개 변수는 선택 사항이므로 사용자가 쿼리에 추가할 모든 입력 또는 입력을 제공하지 않을 수 있습니다.

    따라서 where and that's where when 가 우리를 구하기 위해 오는 곳으로 검색할 때 추가 코드를 작성해야 합니다. 이것은 공식 문서가 그것에 대해 말하는 것입니다

    Sometimes you may want clauses to apply to a query only when something else is true. For instance you may only want to apply a where statement if a given input value is present on the incoming request. You may accomplish this using the when method:



    그리고 이렇게 씁니다.

    $users = DB::table('users')
                    ->when($role, function ($query, $role) {
                        return $query->where('role_id', $role);
                    })
                    ->get();
    


    그러나 한 가지 더 문제가 있습니다. 동일한 매개변수에 대해 여러 값을 추가하는 방법은 무엇입니까? when의 두 번째 인수는 함수이고 이 함수에서 무엇이든 할 수 있습니다 :) 계속 읽기

    따라서 동일한 매개변수에 대한 여러 값을 확인하기 위해 루프를 사용할 것이며 이것이 다음과 같습니다.

    ->when($gotra, function ($query, $gotra) {
                   foreach($gotra as $g){
                       $query->where('biodata->family->father_gotra', '<>' ,$g);
                   }
                   return $query;
               })
    


    그게 다야. 검색 기능을 작성하는 데 필요한 모든 기본 사항을 다루었습니다. 그리고 이것은 다음과 같이 보일 것입니다

    public function search(){
    
           $gender = request('gender');
           $state = request('state');
    
           $minIncome = (int)request('minIncome');
           $minHeight = (int)request('minHeight');
    
           $qualifications = request('qualification') != '' ? explode(",", request('qualification') ) : false;
    
           $gotra = request('gotra') != '' ? explode(",", request('gotra') ) : false;
    
           $results = Biodata::
               when($gender, function ($query, $gender) {
                   return $query->where('gender', $gender);
               })
               ->when($state, function ($query, $state) {
                   return $query->where('biodata->contact->state', $state);
               })
               ->when($qualifications, function ($query, $minQualification) {
    
                   foreach($qualifications as $qualification){
                       $query->where('biodata->personal->qualification', '=', $qualification);
                   }
                   return $query;
    
               })
               ->when($minIncome, function ($query, $minIncome) {
                   return $query->where('biodata->personal->income', '>=', $minIncome);
               })
               ->when($minHeight, function ($query, $minHeight) {
                   return $query->where('biodata->personal->height', '>=' , $minHeight);
               })
               ->when($gotra, function ($query, $gotra) {
                   foreach($gotra as $g){
                       $query->where('biodata->family->father_gotra', '<>' ,$g);
                   }
                   return $query;
               })
               ->paginate(10);
    
              return response($results,200);
    


    나는 이것을 개발하는 동안 TDD 접근 방식을 따랐으므로 먼저 테스트를 만들었습니다. 테스트를 원하는 사람이 있으면 알려주세요. 저에게 메시지를 보내주시면 코드를 공유하겠습니다.

    그래서 나는 오늘 여러분에게 이것을 남길 것입니다. 여러분의 생각을 알려주세요.

    좋은 웹페이지 즐겨찾기