2016-09-09 4 views
1

Прямо сейчас я немного рассол. Я пытаюсь оптимизировать старый код, используя больше соглашений laravels вместо того, чтобы создавать свои собственные циклы, чтобы получить нужные мне данные.Laravel выбор отношения отношения без использования петли

Так вот что я прямо сейчас:

Регион Модель

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'); 
    } 
} 

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 красноречивый отношения гораздо чище:

$region->vms()->where('status', true)->count(); 

Теперь то, что я хочу сделать что-то вроде этого:

$games = $region->vms()->where('status', true)->games(); 

Это не будет работать, очевидно, у меня тоже пытался играть с «с» и «где», но безрезультатно.

Я действительно надеюсь, что вы могли бы мне помочь.

С наилучшими пожеланиями, Ниеком

+1

Если вы хотели бы добавить условное в связи между ними, я не думаю, поэтому вы можете сделать это просто. Laravel поддерживает отношения через (https://laravel.com/docs/5.3/eloquent-relationships#has-many-through), но я не уверен, что вы сможете использовать его в своем примере. – Mishek

ответ

2

Вы могли бы попробовать что-то вроде этого, используя жадную загрузку и срывать():

$games = Region::with(['vms' => function($query) { 
    $query->where('status', true); 
}, 'vms.games'])->get()->pluck('vms.games'); 
+0

Интересный способ, я попробую его как можно скорее. Спасибо. Ps. Я не возражаю против итерации через объекты, чтобы сформировать свою собственную коллекцию, просто пытаясь улучшить аплодисменты :) – Deejdd

Смежные вопросы