Функция поиска API Laravel с несколькими параметрами - PullRequest
0 голосов
/ 03 ноября 2019

Я почти прочитал всю статью в google и сообщения в stackoverflow, но не смог найти правильное решение или не получил его. В любом случае, я хочу создать функцию поиска в Laravel API, поэтому я начал с:

public function search(Request $request) {
    $data = $request->get('data');

    $search = Post::where('title', 'like', "%{$data}%")
             ->orWhere('user_id', 'like', "%{$data}%")
             ->get();

    return response()->json([
        'data' => $search
    ]);
}

Это нормально работает, и по приведенному ниже URL-адресу возвращаются данные:

http://127.0.0.1:8000/api/search?data=22

{
    "data": [
        {
            "id": 10,
            "title": "some",
            "created_at": "2019-11-02 07:56:40",
            "updated_at": "2019-11-02 07:56:40",
            "user_id": "22"
        }
    ]
}

Но я хочу получить данные для каждого параметра, как этот, а также удалить параметры из URL, вместо этого отправив в виде данных формы:

http://127.0.0.1:8000/api/search

данные формы:

{
user_id: 22
}

Итак, что я пробовал до сих пор:

   public function search(Request $request) {
        $user_id = request('user_id'); // this return 22
        $title = request('title');

        $search = Post::where('title', 'like', "%{$title}%")
                 ->orWhere('user_id', 'like', "%{$user_id}%")
                 ->get();

        return response()->json([
            'data' => $search
        ]);
    }

Но он возвращает все данные, а не только данные с user_id-> 22, Есть идеи?

Результат:

{
    "data": [
        {
            "id": 8,
            "title": "some",
            "created_at": "2019-11-02 07:55:57",
            "updated_at": "2019-11-02 07:55:57",
            "user_id": "12"
        },
        {
            "id": 10,
            "title": "some",
            "created_at": "2019-11-02 07:56:40",
            "updated_at": "2019-11-02 07:56:40",
            "user_id": "22"
        },
        {
            "id": 11,
            "title": "some",
            "created_at": "2019-11-02 07:56:45",
            "updated_at": "2019-11-02 07:56:45",
            "user_id": "4"
        },
        {
            "id": 12,
            "title": "some",
            "created_at": "2019-11-02 07:56:47",
            "updated_at": "2019-11-02 07:56:47",
            "user_id": "42"
        }
    ]
}

Я хочу, чтобы он просто возвратил id 10, потому что это только данные с user_id 22.

Ответы [ 2 ]

3 голосов
/ 03 ноября 2019

Исправлена ​​проблема путем изменения ->orWhere на ->where, чтобы сделать условие как AND.

0 голосов
/ 03 ноября 2019

Я использую запрос post, когда используются несколько параметров.

Затем в функции я фильтрую данные, как показано ниже:

public function searchFilters($request){
    $query = User::query();
    if($request->has('name')){
        $query = $query->where('title','like','%'.$request->name.'%');
    }
    if($request->has('salary_negotiable')){
        $query = $query->where('negotiable',$request->salary_negotiable);
    }
    if($request->has('city_ids')){
        $query = $query->whereIn('city_id',$request->city_ids);
    }
    if($request->has('experience_level_ids')){
        $query = $query->whereIn('experience_level_id',$request->experience_level_ids);
    }
    if($request->has('job_type_ids')){
        $query = $query->whereIn('job_type_id',$request->job_type_ids);
    }
    if($request->has('language_name')){
        $query = $query->whereHas('jobLanguageIds',function ($q) use($request){
            $q->select('languages.id','languages.name')->where('languages.name',$request->language_name);
        });
    }
    return $query;
}

Эта функция просто возвращает $queryэкземпляр, так что я могу повторно использовать и добавлять больше запросов, где я хочу. Будьте осторожны с добавлением orWhere[...] ограничений, так как они могут отменять все остальные условия, если вы не включите их в общее where().

Вы также можете изменить return $query на return $query->get();, если вынемедленно получить фактический результат из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...