Laravel 不使用循环获取关系的关系
Laravel fetch relation of relation without using a loop
现在我有点不知所措。我正在尝试使用更多的 laravels 约定来优化旧代码,而不是为了获取我需要的数据而构建自己的循环。
所以这是我现在拥有的:
区域模型
class Region extends Eloquent {
public $timestamps = false;
public function vms() {
return $this->hasMany('Vm');
}
}
游戏模型
class Game extends Eloquent {
public $table = 'vm_games';
public function vm() {
return $this->hasOne('Vm');
}
}
虚拟机型号
class Vm extends Eloquent {
public function games() {
return $this->hasMany('Game');
}
}
现在我现在要做的是:
$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;
现在当然使用 Laravels Eloquent 关系更清晰:
$region->vms()->where('status', true)->count();
现在我想做的是这样的:
$games = $region->vms()->where('status', true)->games();
这显然行不通,我也试过 "with" 和 "whereHas" 但无济于事。
真心希望你能帮帮我。
亲切的问候,
尼克
你可以尝试这样的事情,使用预加载和 pluck():
$games = Region::with(['vms' => function($query) {
$query->where('status', true);
}, 'vms.games'])->get()->pluck('vms.games');
现在我有点不知所措。我正在尝试使用更多的 laravels 约定来优化旧代码,而不是为了获取我需要的数据而构建自己的循环。
所以这是我现在拥有的:
区域模型
class Region extends Eloquent {
public $timestamps = false;
public function vms() {
return $this->hasMany('Vm');
}
}
游戏模型
class Game extends Eloquent {
public $table = 'vm_games';
public function vm() {
return $this->hasOne('Vm');
}
}
虚拟机型号
class Vm extends Eloquent {
public function games() {
return $this->hasMany('Game');
}
}
现在我现在要做的是:
$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;
现在当然使用 Laravels Eloquent 关系更清晰:
$region->vms()->where('status', true)->count();
现在我想做的是这样的:
$games = $region->vms()->where('status', true)->games();
这显然行不通,我也试过 "with" 和 "whereHas" 但无济于事。
真心希望你能帮帮我。
亲切的问候, 尼克
你可以尝试这样的事情,使用预加载和 pluck():
$games = Region::with(['vms' => function($query) {
$query->where('status', true);
}, 'vms.games'])->get()->pluck('vms.games');