Как отсортировать данные при поиске в соответствии с полученными ими оценками, а также с оценками, которые не были оценены - PullRequest
0 голосов
/ 28 мая 2019

У меня есть проект управления персоналом, где я хочу отображать рейтинги и не рейтинги соискателей при поиске как работодатель.

I have tried this but this only gives jobseekers whose ratings has been set.
public function search(Request $request)
    {
        $query = $request->get('query');
        if (isset($query)) {
            $queryParam = explode(' ', $query);
        } else {
            $queryParam = null;
        }
        $jobseekers = JobSeekers::where(function ($que) use ($queryParam) {
            if (isset($queryParam)) {
                foreach ($queryParam as $queries) {
                    $que->orWhere('job_seekers.category', 'like', '%' . $queries . '%');
                    $que->orWhere('job_seekers.keywords', 'like', '%' . $queries . '%');
                    $que->orWhere('job_seekers.experience', 'like', '%' . $queries . '%');
                }
            }
        })->join('ratings', 'job_seekers.id', '=', 'ratings.js_id')
            ->groupBy('job_seekers.id')
            ->select('job_seekers.id', DB::raw('AVG( ratings.rating )  AS average_rating'))
            ->orderBy('average_rating', 'desc')
            ->get();
        return view('search.search_all', compact('jobseekers'));
    }
    I have a rating table .
    Schema::create('ratings', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('emp_id')->unsigned();
        $table->integer('js_id')->unsigned();
        $table->integer('rating')->unsigned();
        $table->longText('description')->nullable();
        $table->foreign('emp_id')->references('id')->on('employers');
        $table->foreign('js_id')->references('id')->on('job_seekers');
        $table->timestamps();
    });

Я получаю данные только по объектам, чьи оценки даны, но не для данные, которые существуют, но не имеют рейтинга.

1 Ответ

1 голос
/ 28 мая 2019

Попробуйте leftJoin() вместо join().

JOIN выбирает только результаты с данными в объединенной таблице.

LEFT JOIN выбирает все результаты и прикрепляет данные из объединенной таблицы.

public function search(Request $request)
{
    $jobseekers = JobSeekers
        ::when($request->get('query'), function($query) use ($request) {
            $words = explode(' ', $request->get('query'));
            foreach($words as $word){
                $query->orWhere('job_seekers.category', 'like', '%' . $word . '%');
                $query->orWhere('job_seekers.keywords', 'like', '%' . $word . '%');
                $query->orWhere('job_seekers.experience', 'like', '%' . $word . '%');
            }
        })
        ->leftJoin('ratings', 'job_seekers.id', '=', 'ratings.js_id')
        ->groupBy('job_seekers.id')
        ->select('job_seekers.id', DB::raw('AVG( ratings.rating )  AS average_rating'))
        ->orderBy('average_rating', 'desc')
        ->get();

    return view('search.search_all', compact('jobseekers'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...