Laravel 4 -我的视图模板中有太多的逻辑


Laravel 4 - Too much logic in my view template?

我在我的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