我在Laravel项目中创建了一个搜索功能 - 用户可以搜索团队名称或用户名 - 结果创建并返回如下:
$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));
现在变得有点复杂了。我有一个数据库表“relation”,它通过包含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-&gt; where('team_id'),因为我已经做了$ team_obj-&gt; ...但是否则它无法正常工作。
感谢任何帮助。谢谢!
答案 0 :(得分:1)
您是否有必要向团队展示您的用户无法申请?如果不是,您只需修改代码即可获得您的用户不是其成员的团队。如果需要,您可以在控制器中进行一些检查以获取该信息。
我建议为每个团队制作一个foreach,并检查他们是否与用户有关系。您可以在团队中设置属性以检查视图。
控制器:
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';
答案 1 :(得分:0)
是的,视图的逻辑太多(就最佳实践而言)
你们为这些人建立了关系吗?假设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