2015-10-06 4 views
1

Я пытаюсь создать поисковую систему для пользователей. Поиск будет состоять из нескольких полей, чтобы пользователь мог выбирать все, что захочет, и получить результат.Объединить несколько запросов (Laravel 5)

routes.php:

Route::get('search/{tag?}/{town?}/{education?}/{contract?}', '[email protected]'); 

DisplayJobs.php Контроллер

public function getSearch($tag = null, $town = null, $education = null, $contract = null) 
{ 
    //get already database values to send them to the form 
    $tags = \App\Tag::lists('name', 'id'); 
    $contract = \App\Contract::lists('name', 'id'); 
    $towns = \App\Town::lists('name', 'id'); 
    $education = \App\Education::lists('name', 'id'); 

    $tagQueryBuilder = Tag::query(); 
    $townQueryBuilder = Town::query(); 
    $educationQueryBuilder = Education::query(); 
    $contractQueryBuilder = Contract::query(); 

    if(Input::has('tag')) 
    { 
     $tagQueryBuilder->TagOfUser(Input::get('tag')); 
    } 
    if(Input::has('town')) 
    { 
     $townQueryBuilder->TownOfUser(Input::get('town')); 
    } 
    if(Input::has('education')) 
    { 
     $educationQueryBuilder->EducationOfUser(Input::get('education')); 
    } 
    if(Input::has('contact')) 
    { 
     $contractQueryBuilder->ContactOfUser(Input::get('contact')); 
    } 


    return view('main.search_jobs', compact('tags', 'towns', 'contract', 'education')); 

} 

Если я пытаюсь с каждым отдельным запросом он прекрасно работает, но я хочу совмещенные данные результатов от всех запросов или способа запроса сразу всех данных.

В каждой модели у меня есть сфера запрос, как этот (Tag.php) Модель:

public function jobs() 
{ 
    return $this->belongsToMany('App\Job'); 
} 

public function scopeTagOfUser($query, $tag) 
{ 
    return $query->where('id', '=', $tag)->with('jobs'); 
} 
+0

Ваш вопрос не ясен. Вы хотите, чтобы объединенные данные результата из всех запросов или вы хотели бы запросить сразу все данные? Кроме того, ни один из списков '\ App \ Something :: ('name', 'id');' work, что заставляет меня задаться вопросом, вы даже запустили код? – JSelser

+0

Благодарим за сообщение. Весь код \ App \ Something :: lists ('name', 'id'); отлично работает, я попробовал. Я хочу только объединить данные результата из всех запросов или способ запросить сразу все данные. –

+0

Также он работает с каждым запросом. –

ответ

1

После многих часов я нашел решение. Я опубликую его ниже, поэтому, если у кого-то есть такая же проблема, можно увидеть одно решение.

Сначала я удалить все области видимости запросов в моделях и все работы завершены к контроллеру, как ниже:

public function getSearch($tag = null, $town = null, $education = null, $contract = null) 
{ 
    //get already database values to send them to the form 
    $tags = \App\Tag::lists('name', 'id'); 
    $towns = \App\Town::lists('name', 'id'); 
    $contract = \App\Contract::lists('name', 'id'); 
    $education = \App\Education::lists('name', 'id'); 

    //get inputs from users 
    $getTagFromUser = Input::get('tag'); 
    $getTownFromUser = Input::get('town'); 
    $getContractFromUser = Input::get('contract'); 
    $getEducationFromUser = Input::get('education'); 

    $tagQuery = DB::table('jobs') 
     ->join('job_tag', 'jobs.id', '=', 'job_tag.job_id') 
     ->join('tags', 'job_tag.tag_id', '=', 'tags.id') 
     ->where('tags.id', '=', $getTagFromUser); 

    $townQuery = DB::table('jobs') 
     ->join('job_town', 'jobs.id', '=', 'job_town.job_id') 
     ->join('towns', 'job_town.town_id', '=', 'towns.id') 
     ->where('towns.id', '=', $getTownFromUser); 

    $contractQuery = DB::table('jobs') 
     ->join('job_contract', 'jobs.id', '=', 'job_contract.job_id') 
     ->join('contracts', 'job_contract.contract_id', '=', 'contracts.id') 
     ->where('contracts.id', '=', $getContractFromUser); 

    $educationQuery = DB::table('jobs') 
     ->join('job_education', 'jobs.id', '=', 'job_education.job_id') 
     ->join('education', 'job_education.education_id', '=', 'education.id') 
     ->where('education.id', '=', $getEducationFromUser); 


    $finalQuery = $tagQuery->union($townQuery)->union($contractQuery)->union($educationQuery)->get(); 


    return view('main.search_jobs', compact('tags', 'towns', 'contract', 'education', 'finalQuery')); 

} 
Смежные вопросы