查询构建器条件参数

时间:2015-07-16 23:34:23

标签: php mysql laravel-5

我有一个用户表,其中包含belongsToMany基础上的相关数据

 users
    id
    first_name

 skills
    id
    name

 positions
    id
    name

 position_user
    position_id
    user_id
    created_at
    updated_at

 skill_user
   skill_id
   user_id
   created_at
   updated_at

在用户模型中

public function positions()
{
    return $this->belongsToMany('App\Position')->withTimestamps();
}

和位置

public function users()
{
    return $this->belongsToMany('App\User')->withTimestamps();
}

(技能相同)

我目前正在将以下内容传递给视图:

$users = User::with('skills')
->with('skills')
->with('positions')
->get();

我希望能够搜索各种技能和职位组合,但很难创造出优雅的解决方案。

如果我选择一个或多个位置,将其传递给控制器​​,我可以将信息返回为:

if (Request::get('positions'))
{
    $positions = Request::get('positions');
}

位置数组看起来像     阵列:3 [?     0 => “分析师”     1 => “律师”     2 => “建筑师”]

if($positions)
{
    $users = User::with('skills')
    ->with('skills')
    ->with('positions')
    ->orWhereHas('positions', function($thisquery) use ($positions)
    {
        $thisquery->whereIn('name', $positions);
    })
    ->get();
}

如果我对同样有效的技能也这样做。

我需要做的是将它们组合起来 - 特别是因为我将在搜索功能中添加更多相关表格。

我试过了:

if(($positions)&&($skills))
{
    $users = User::with('skills')
    ->with('skills')
    ->with('positions')
    ->orWhereHas('positions', function($thisquery) use ($positions)
    {
       $thisquery->whereIn('name', $positions);
    })
    ->orWhereHas('skills', function($thisquery) use ($skills)
    {
        $thisquery->whereIn('name', $skills);
    })
    ->get();
}

但我想要的更像是

$users = User::with('skills')
->with('skills')
->with('positions');
if($skills)
{
    $users->orWhereHas('skills', function($thisquery) use ($skills)
    {
       $thisquery->whereIn('name', $skills);
    });
 }

if($positions)
{
    $users->orWhereHas('positions', function($thisquery) use ($positions)
    {
         $thisquery->whereIn('name', $positions);
    });
}
$users->get();

但是这不起作用-just返回空结果集。

如何以优雅的方式实现这一目标?

或者是否有更好的方法来实现搜索功能 - 实际上我只想过滤某些参数。

2 个答案:

答案 0 :(得分:1)

我认为你需要“和哪里”的条件。或者意味着匹配一个或另一个或两个规则。 “只有两条规则匹配才会有效。”

所以我建议尝试这个:

$users = User::with('skills')
->with('skills')
->with('positions');
if($skills)
{
    $users->whereHas('skills', function($thisquery) use ($skills)
    {
       $thisquery->whereIn('name', $skills);
    });
 }

if($positions)
{
    $users->whereHas('positions', function($thisquery) use ($positions)
    {
         $thisquery->whereIn('name', $positions);
    });
}
$users = $users->get();

答案 1 :(得分:0)

我最近自己解决了这个问题。

我最终做的是以下内容:

  1. 将所有相关数据放入数组中。

  2. 过滤该数组以匹配参数值

  3. 返回已过滤的数组。

  4. 您甚至可以在添加或更新元素时​​缓存步骤1并重新缓存。

    继续尝试实施。如果您遇到困难,请使用相关代码更新您的问题。