我有一个用户表,其中包含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返回空结果集。
如何以优雅的方式实现这一目标?
或者是否有更好的方法来实现搜索功能 - 实际上我只想过滤某些参数。
答案 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并重新缓存。
继续尝试实施。如果您遇到困难,请使用相关代码更新您的问题。