【问题标题】:Combine multiple queries (Laravel 5)组合多个查询(Laravel 5)
【发布时间】:2015-10-06 19:17:59
【问题描述】:

我尝试为用户制作搜索引擎。搜索将包含多个字段,以便用户可以选择他想要的任何内容并获得结果。

routes.php:

Route::get('search/{tag?}/{town?}/{education?}/{contract?}', 'DisplayJobs@getSearch');

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');
}

【问题讨论】:

  • 你的问题不清楚。您想要来自所有查询的组合结果数据,还是想要一次查询所有数据的方法?另外,\App\Something::lists('name', 'id'); 没有一个工作,这让我想知道,你甚至运行过代码吗?
  • 感谢您的回复。所有代码 \App\Something::lists('name', 'id');完美运行,我试过了。我只想合并所有查询的结果数据或一次查询所有数据的方法。
  • 它也适用于每个查询。

标签: php laravel laravel-5 eloquent


【解决方案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'));

}

【讨论】:

  • 您的回答对我目前正在运行的项目非常有帮助,并且我在几天前遇到了您描述的同一问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多