Красноречиво, где условие И (условие ИЛИ условие ИЛИ условие) - PullRequest
0 голосов
/ 01 марта 2020

Может кто-нибудь сказать мне, что я делаю не так? Я хочу получить все проекты со статусом 0 и, если какие-либо данные совпадают, в eloquent. Мой код выглядит так:

public function search(Request $request){
        if($request->has('q')){

            $search_query = $request->input('q');

            $projects = Project::where(['status' => '0'])->get();

            $projects = $projects->where(function($query) use ($search_query) {
                $query->where('title','LIKE','%'.$search_query.'%')
                      ->orWhere('shortDescription','LIKE','%'.$search_query.'%')
                      ->orWhere('longDescription','LIKE','%'.$search_query.'%')
                      ->orWhere('tags','LIKE','%'.$search_query.'%')
                      ->orWhere('projectLink','LIKE','%'.$search_query.'%');
            });
            $projects->get();

            dd($projects);
         }
}

И я получаю эту ошибку

ErrorException
explode () ожидает, что параметр 2 будет строкой, объект задан

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Я решил проблему, но немного изменил код ... Если хочешь, возьми! Я проверил, и он работает.

if($request->has('q')){

        // Your $request->q Value
        $term = $request->q;

        $projects = DB::table('tbl_projects')->where('status', '=', 0) 
                    ->where(function ($query) use ($term) {
                        $query->where('title', 'LIKE', '%'.$term.'%')
                        ->orWhere('shortDescription', 'LIKE', '%'.$term.'%')
                        ->orWhere('longDescription', 'LIKE', '%'.$term.'%')
                        ->orWhere('tags', 'LIKE', '%'.$term.'%')
                        ->orWhere('projectLink', 'LIKE', '%'.$term.'%');
                   })
                   ->get();

        //dd($projects);
    }

Необработанный запрос:

select * from `tbl_projects` where `status` = 0 and (`title` LIKE %bla bla% or `shortDescription` LIKE %bla bla% or `longDescription` LIKE %bla bla% or `tags` LIKE %bla bla% or `projectLink` LIKE %bla bla%))

С уважением!

0 голосов
/ 01 марта 2020

Ваша ошибка:

$projects = Project::where(['status' => '0'])->get();
  1. (['status' => '0']) Если требуемые параметры предложения отличаются. Вы должны использовать ('status', '0') или ('status', '=', '0')
  2. Когда вы используете -> get () , у вас есть объект Collection или EloquentCollection. Вам нужен QueryBuilder

Попробуйте реализовать лучшую логику программирования c.

Лучшая реализация -

public function search(Request $request){
    if($request->has('q')){
         // Add array with field coincidences target. Is better if this array is a const static field in the Project model
        $searchFields = ['title', 'shortDescription', 'longDescription', 'tags', 'projectLink' ]; 
        // Now you can add 100 fields for search coincidences easily

        $search_query = $request->input('q');

        $projects = Project::where('status', '0');
        foreach($searchFields as $searchField){
            if ($searchField == 'title'){
                $projects = $projects->where($searchField,'LIKE',"%$search_query%");
                continue;
            }
               $projects = $projects->orWhere($searchField,'LIKE',"%$search_query%");
        }
        $projects = $projects->get();

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