Прежде всего, я прошу прощения за титул, я не мог найти ничего лучшего.Оптимизация запросов на отношения Laravel
В моем проекте у меня есть пользователи и группы. Пользователи могут присоединиться к группе и создать группу. Соотношения определяются следующим образом.
пользователя Модель
/** Get all the groups the user is administrator of
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function groupsAdmin()
{
return $this->hasMany('App\Group','group_admin_id','id');
}
Group Модель
/** Get the users in a group
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function users()
{
return $this->belongsToMany(\App\User::class,'groups_users', 'group_id','user_id');
}
То, что я пытаюсь сделать, это получить все пользователи, которые присоединились группы, созданные пользователем. Для этого я написал метод в моей модели пользователя:
/**
* Returns all the users who have attended groups created by this user
*/
public function getPastGroupAttendees()
{
// first verify if the user is admin of any group
if(!$this->groupsAdmin)
{
return false;
}
$attendees = array();
foreach($this->groupsAdmin as $group)
{
if(count($group->users) > 0) $attendees[] = $group->users;
}
return $attendees;
}
Но проблема с этим методом является медленной и будет все медленнее с новыми данными. А также, когда пользователь может присоединиться к нескольким группам, я получаю дубликатов пользователей из этого метода. Итак, если кто-нибудь может показать мне некоторые направления, чтобы оптимизировать и исправить это, это было бы очень полезно.
Спасибо, таким образом, время загрузки стали быстрее, но все-таки имеет дубликат проблема пользователя. Например, пользователь присоединился к двум созданным мной группам. Поэтому я бы дважды использовал этого пользователя для двух групп. Я могу прокрутить запись и удалить всех пользователей, которые перечислены дважды, но будет ли это эффективно? –
Прочтите обновленный ответ. –
Большое спасибо. Я пошел с вашим первым решением 'merge()' и 'unique()'. –