我在我的Laravel项目中创建了一个搜索功能——用户可以搜索teamnames或usernames——结果创建并返回如下:
$teams_obj = Team::where('teamname', 'LIKE', '%'.Input::get('searchterm').'%')->get();
$persons_obj = User::where('name', 'LIKE', '%'.Input::get('searchterm').'%')->orWhere('vorname', 'LIKE', '%'.Input::get('searchterm').'%')->get();
return View::make("team.search-content", array('resp' => 'resultlist', 'teams_obj' => $teams_obj, 'persons_obj' => $persons_obj))->with('user', User::find(Auth::user()->id));
现在它变得有点复杂了。我有一个数据库表"关系",它通过包含user_id和team_id的条目存储用户是否为团队成员。Laravel知道这个关系。
如果搜索结果显示在视图中,我必须区分当前用户是否已经是当前行中显示的各自团队的成员。如果用户已经是团队中的成员,他就不能申请,否则他应该有申请的选项。
我是这样解决的:
@foreach($teams_obj as $team_obj)
<li data-teamid="{{ $team_obj->id }}">
<span>{{ $team_obj->teamname }}</span>
<?php
$data = ['user_id' => $user->id, 'team_id' => $team_obj->id];
$res = $team_obj->whereHas('Relation', function($q) use ($data) {
$q->where('team_id', '=', $data['team_id']);
$q->where('user_id', '=', $data['user_id']);
})->get();
if (count($res) == 0) {
echo'apply fct available';
}
?>
</li>
@endforeach
我获取关系并检查team_id和user_id的关系是否存在。但是我有一种奇怪的感觉,在我的视图模板中这样做。你觉得呢?我该如何改进呢?
此外,我认为这是奇怪的,我必须使$q->where('team_id'),因为我已经做$team_obj->…但除此之外不能正常工作。
任何帮助都是感激的。谢谢!
您是否需要向团队显示您的用户无法申请?如果不是,您可以简单地修改您的代码,以获得您的用户不是成员的团队。如果你需要,你可以在控制器中做一些检查,以获得该信息。
我建议为每个团队做一个检查,检查他们是否与用户有关系。您可以在团队中设置一个属性,以便在视图中检查。
控制器:
foreach($teams_obj as $team_obj){
$res = $team_obj->whereHas('Relation', function($q) use ($data) {
$q->where('team_id', '=', $data['team_id']);
$q->where('user_id', '=', $data['user_id']);
})->get();
if(count($res) == 0)
$team_obj->isApplyableByUser = true;
else
$team_obj->isApplyableByUser = false;
// You can do the same code above in one line, but it's not that compreensive
$team_obj->isApplyableByUser = count($res) == 0;
}
视图:
if($team_obj->isApplyableByUser) echo'apply fct available';
是的,对于视图来说逻辑太多了(就最佳实践而言)
你为这些人建立关系了吗?假设Team
hasMany('User')
…为什么不直接加载你的User
模型?
$teams = Team::with(['users' => function($query){
$query->where('name', 'LIKE', '%'.Input::get('searchterm').'%')
->orWhere('vorname', 'LIKE', '%'.Input::get('searchterm').'%')
}])where('teamname', 'LIKE', '%'.Input::get('searchterm').'%')
->get();
return View::make('your.view', ['teams' => $teams]);
//在你看来。
@foreach($teams as $team)
<li data-teamid="{{ $team->id }}">
<span>{{ $team->teamname }}</span>
@if(!$team->users->count())
apply fct available
@endif
</li>
@endforeach