2015-01-26 3 views
2

У меня есть 3 модели. Компания, Пользователь, Группа. Я пытаюсь вернуть все записи компании, чей создатель (пользователь) имеет (группу) того, что я указываю.красноречивый запрос несколько отношений глубокий

Company.php

public function user() { 
    return $this->belongsTo('User'); 
} 

User.php

public function company() 
{ 
    return $this->hasMany('Company')->orderBy('created_at', 'desc'); 
} 

public function group() 
{ 
    return $this->belongsToMany('Group')->withTimestamps(); 
} 

public function hasGroup($check) 
{ 
    if(is_array($check)) { 
     $groups = array_fetch($this->group->toArray(), 'name_short'); 
     return !!array_intersect($check, $groups) ? true : false; 
    } else { 
     return in_array($check, array_fetch($this->group->toArray(), 'name_short')); 
    } 
} 

Group.php

public function user(){ 
    return $this->belongsToMany('User');  
} 

Я знаю, как сделать запрос непосредственно связанных моделей. Не знаете, с чего начать на моделях, связанных с непосредственно связанными моделями.

Ниже приведена концепция, а не работоспособный код. Как бы я думал, это сработает.

$companies = Company::where('active','=','1')where($this->user->hasGroup(array('admin','moderator','subscriber'))); 

Этот вид получает меня, что я ищу.

$c = Company::with('user.group')->where('active','=',1)->get(); 

Это своего рода показывает, что мне нужно, просто не знаю, как показать только записи с определенным компании-> user-> собственности группы. Вот выход из этого в формате JSON для удобства чтения - http://pastebin.com/wFTi9ye0

Пробовал это, не работает:

$names = array('subscriber','user'); 
$c = Company::with(array('user.group' => function($query) use($names) 
{ 
    $query->whereIn('name_short', $names) 
}))->get(); 

.edit. Просто попытался это:

$c = Company::whereHas('user', function($q) 
{ 
    $q->whereHas('group', function($q) 
    { 
     $q->where('name_short', '=', 'user'); 
    }); 
}); 

#print_r($c->toJSON()); 
print_r($c); 

браузер разбился. Я чувствую, что я рядом. Есть идеи?

ответ

1

Фигурные это :)

$c = Company::where('active','=',1)->whereHas('user', function($q) 
{ 
    $q->whereHas('group', function($q) 
    { 
     $q->whereIn('group.name_short', array('admin','user')); 
    }); 
})->get(); 
Смежные вопросы