2015-07-08 3 views
0

У меня есть три Модели (Организация, Пользователь, Посещение) и 4 таблицы (организации, пользователи, организация_узлер, посещения). Я пытаюсь получить общее количество посещений пользователей для организации.Laravel: Сложная Красноречивая связь - hasManyThrough или принадлежит ToMany подход?

Organization 
------------ 
id, 
name 

User 
--------- 
id, 
name 

Organization_User 
---------------- 
id, 
organization_id, 
user_id 

Visit 
-------------- 
id, 
user_id 
views 

Просто чтобы прояснить, нет никакой модели Organization_User, то есть только в сводной таблице, используемый пользователем и организации:

$organization->belongsToMany('User'); 
$user->belongsToMany('Organization'); 

Я мог бы запросить все user_ids из сводной таблицы по group_id и затем получите все посещения для каждого user_id, но чем больше Eloquent-подход?

Пользователь имеет несколько посещений и посещение принадлежит пользователю. Посещение не относится к Организации.

+0

Я не вижу никакой связи между посетителем и пользователем, и у пользователя может быть много организаций - как вы определяете, к какой организации относится запись посещения? Или должен ли визит, связанный с пользователем A, подсчитываться для всех организаций, к которым принадлежит этот пользователь? –

+0

Пользователь hasMany посещений и посещение принадлежит пользователю. Посещение не принадлежит Организации, а только Пользователю. То, что я пытаюсь сделать, это получить общее количество посещений пользователями в Организации. – askilondz

+0

Вы считаете, что добавить 'visit_amount' в' Organization_User'? –

ответ

2

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

$org = Organization::find($org_id); 
return DB::table('visits')->whereIn('user_id', $org->users->modelKeys())->sum("views"); 

The modelKeys() возвращает все идентификаторы пользователей, привязанные к этой организации. Затем я получаю сумму всех просмотров для этих пользователей.

* Обратите внимание, что также важно использовать Организацию :: find, а не DB :: table ('organization'), чтобы поддерживать отношения «Красноречивое». В противном случае пользователи $ organization-> выдадут ошибку.

+0

У меня вопрос, не вызывает ли '$ org-> users-> modelKeys()' идентификаторы этих пользователей, связанных с этой конкретной организацией? Или это идентификаторы организаций? – Pathros

+1

@pathros возвращает массив первичных ключей всех пользователей, связанных с этой организацией. – askilondz

0

Я думаю, вы могли бы хотеть «имеет много Through» отношения как так:

class Organization extends Model 
{ 
    public function visits() 
    { 
     return $this->hasManyThrough('App\Visit', 'App\User'); 
    } 
} 

Тогда вы могли бы назвать count().

Laravel 5.1 doc

+0

Я не думаю, что это работает, потому что у пользователя нет организации, потому что пользователь может принадлежать многим организациям. Так что отношения - это сводная таблица (Organization_User). – askilondz

+0

Существует множество способов выполнить то, что вы пытаетесь сделать с соответствующими структурами таблиц для любого данного решения. Вы заперты в существующих структурах таблиц? – aethergy

+0

Да, это уже активная архитектура. Также Visits - это собственная большая таблица метаданных ... больше, чем просто посещать подсчеты. – askilondz

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