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

时间:2014-08-19 19:04:47

标签: php laravel

我在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; ...但是否则它无法正常工作。

感谢任何帮助。谢谢!

2 个答案:

答案 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