Laravel 不使用循环获取关系的关系

Dee*_*jdd 2 php laravel laravel-4.2

现在我有点进退两难。我正在尝试使用更多 Laravel 约定来优化旧代码,而不是构建自己的循环来获取我需要的数据。

这就是我现在所拥有的:

区域模型

class Region extends Eloquent {
    public $timestamps = false;

    public function vms() {
        return $this->hasMany('Vm');
    }
}
Run Code Online (Sandbox Code Playgroud)

游戏模型

class Game extends Eloquent {
    public $table = 'vm_games';

    public function vm() {
        return $this->hasOne('Vm');
    }
}
Run Code Online (Sandbox Code Playgroud)

虚拟机型号

class Vm extends Eloquent {    
    public function games() {
        return $this->hasMany('Game');
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想要做的事情如下:

$games = 0;
foreach($region->vms()->where('status', true)->get() as $vm) {
    $games += $vm->games()->where('created_at', '>', date('Y-m-d H:i:s', time() - 5400))->count();
}

$sorted[$region->id]->games = $games;
Run Code Online (Sandbox Code Playgroud)

当然,现在使用 Laravels Eloquent 关系更加清晰:

$region->vms()->where('status', true)->count();
Run Code Online (Sandbox Code Playgroud)

现在我想做的是这样的:

$games = $region->vms()->where('status', true)->games();
Run Code Online (Sandbox Code Playgroud)

这显然行不通,我也尝试过使用“with”和“whereHas”,但无济于事。

我真的希望你能帮助我。

亲切的问候,尼克

pis*_*tor 5

你可以尝试这样的事情,使用急切加载和 pluck():

$games = Region::with(['vms' => function($query) {
    $query->where('status', true);
}, 'vms.games'])->get()->pluck('vms.games');
Run Code Online (Sandbox Code Playgroud)