PHP / Laravel / Bootstrap获取数据

时间:2013-07-31 23:00:14

标签: php twitter-bootstrap laravel laravel-4

我有一个小问题。我在数据库中有一个名为'player_skills'的表。它包含这样的列(示例):

player_id | skill_id |价值|计数

  • 15 0 10 12
  • 15 1 10 51
  • ...
  • 15 8 10 12
  • player_id实际上是玩家的ID,在'玩家'表下是'id'列。 还有八种技能。值是默认值(在这种情况下无关紧要)。计数是值(玩家技能的值)。

    基本上,我想要的是将数据拉入Bootstrap选项卡(示例):

            <div class="tabbable tabs-left">
        <ul class="nav nav-tabs">
        <li class="active"><a href="?skill0" data-toggle="tab">Section 1</a></li>
        <li><a href="?skill1" data-toggle="tab">Section 2</a></li>
        <li><a href="?skill2" data-toggle="tab">Section 3</a></li>
    ...
        </ul>
        <div class="tab-content">
        <div class="tab-pane active" id="?skill0">
        <p>I'm in Section A.</p>
        </div>
        <div class="tab-pane" id="?skill1">
        <p>Howdy, I'm in Section B.</p>
        </div>
        <div class="tab-pane" id="?skill2">
        <p>What up girl, this is Section C.</p>
        </div>
        </div>
        </div>
    

    我想订购它(从最高到最低,(我在每个玩家都有'group_id'列,所以我不希望它包含一个group_id等于3的玩家)但是各种技能)。此外,我有一个位于“玩家”表格中的技能(名为“体验”的栏目),我这样做了:

        public function highscores()
    {
        $players = Player::orderBy('experience','desc')->get();
        return View::make('aac.highscores')->with('players', $players);
    }
    

    它工作正常,但我需要在标签中为每种技能进行更改。

    1 个答案:

    答案 0 :(得分:0)

    Laravel确实很好地满足了您的需求。首先,你必须宣布技能和这样的球员之间的多对多关系(阅读更多:http://laravel.com/docs/eloquent#many-to-many):

    class Skill extends Eloquent {
    
        public function players() {
            return $this->belongsToMany('Player', 'player_skills', 'skill_id', 'player_id')
                        ->withPivot('value', 'count');
        }
    
    }
    

    然后,您可以使用与with方法关联的玩家从数据库中获取所有技能。这种方法不是强制性的(您可以使用all代替)但是热切加载是一种很好的做法(阅读更多:http://laravel.com/docs/eloquent#eager-loading):

    class SkillController extends BaseController {
    
        public function index()
        {
            $skills = Skill::with('players')->get();
    
            return View::make('skill.index', array('skills' => $skills));
        }
    
    }
    

    最后,只需迭代你的技能数组和每个技能中的玩家阵列(了解有关刀片模板的更多信息:http://laravel.com/docs/templates#blade-templating):

    <!-- index.blade.php -->
    <div class="tabbable tabs-left">
        <ul class="nav nav-tabs">
        @foreach ($skills as $skill)
            <li><a href="?{{ $skill->id }}" data-toggle="tab">{{ $skill->name }}</a></li>       
        @endforeach
        </ul>
        <div class="tab-content">
        @foreach ($skills as $skill)
            <div class="tab-pane active" id="?{{ $skill->id }}">
                @foreach ($skills->players as $player)
                    <p>{{ $player->name }} : {{ $player->pivot->count }} points !</p>
                @endforeach
            </div>
        @endforeach
        </div>
    </div>
    

    如果您想按照技能数量订购玩家,可以使用sortBy这样的功能(阅读更多内容:http://laravel.com/docs/eloquent#collections):

    $orderedPlayers = $skill->players->sortBy(function($player) {
        return $player->pivot->count;
    });
    

    询问是否有不明确的事情。