Laravel查询合并

时间:2014-06-17 21:10:46

标签: php sql laravel relational-database eloquent

我有以下表格:
阶段,下注,bet_type。 一个阶段有很多赌注,一个赌注属于一个阶段,一个赌注有很多bet_types,一个bet_type属于许多赌注(多对多)。 我希望能够返回给定阶段的所有投注和每次投注的bet_types(投注由许多bet_types组成)。

例如:

Phase table:
id  name  
1   phase1


Bet table:
id  name  phase
1   bet1  1
2   bet2  1


Bet_Type table:
id  name
1   bet_type1
2   bet_type2


Bet_Bet_Type (connection table):
bet_id   bet_type_id
1        1
1        2
2        1

我想得到的结果是:

{
    bets: 
    [
        {
            id: 1,
            name: "bet1",
            bet_type: 
            [
                {
                    id: 1,
                    name: "bet_type1"
                },
                {
                    id: 2,
                    name: "bet_type2"
                }
            ]
        },
        {
            id: 2,
            name: "bet2",
            bet_type: 
            [
                {
                    id: 1,
                    name: "bet_type1"
                }
            ]
        }
    ]
}

我知道如何获得阶段的所有赌注,例如:

$bets = Phase::find($phaseId)->bets()->get();

但我怎样才能得到上述内容?

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

$phase = Phase::with('bets.betTypes')->find($phaseId);

这需要声明关系方法:

// Phase Model
public function bets()
{
    return $this->hasMany('Bet');
}

// Bet Model
public function betTypes()
{
    return $this->belongsToMany('BetType');
}

// BetType Model
public function bets()
{
    return $this->belongsToMany('Bet');
}

所以你可以使用这样的东西:

$phase = Phase::with('bets.betTypes')->find($phaseId);

// Get all bets
$bets = $phase->bets;

// Get all betTypes from first Bet
$betTypes = $phase->bets->first()->betTypes;

// Get all betTypes from second Bet
$betTypes = $phase->bets->get(1)->betTypes;

// Get first betType from second Bet
$betType1 = $phase->bets->get(1)->betTypes->get(0); // or first()

如果你在视图中循环(Blade):

{{ $phase->name }}
@foreach($phase->bets as $bet)
    {{ $bet->name }}
    @foreach($bet->betTypes as $betType)
        {{ $betType->name }}
    @endforeach
@endforeach