Recupera la relazione a distanza attraverso l'has-many-through per la relazione molti-a-molti in Laravel

Ho i seguenti templates nella mia applicazione

  • Utente
  • Gruppo
  • Compito

che hanno le seguenti relazioni

  • Utente e gruppo hanno una relazione molti-a-molti
  • Task e Group hanno una relazione molti-a-molti

Quindi in pratica un utente può appartenere a più di un gruppo e each gruppo può avere più di un task.

Di seguito è riportta la struttura della tabella.

utenti

  • id
  • nome

gruppi

  • id
  • nome

compiti

  • id
  • nome

group_user

  • id
  • group_id (chiave esterna con tabella dei gruppi)
  • user_id (chiave esterna con tabella utenti)

group_tasks

  • id
  • group_id (chiave esterna con tabella dei gruppi)
  • task_id (chiave esterna con tabella delle attività)

Ora voglio recuperare tutte le attività per l'utente.

Ho provato i seguenti approcci ed entrambi non hanno funzionato.

Approccio 1

  • $user->groups() fornisce l'elenco di gruppi per un utente
  • $group->tasks() fornisce l'elenco delle attività per un gruppo

Così ho provato

$user->groups()->tasks() ma non ha funzionato.

Approccio 2

Ho provato Has Many Through aggiungendo questo al mio model User

 public function tasks() { return $this->hasManyThrough(Task::class, Group::class); } 

ma anche quello non ha funzionato. Quello che segue è l'errore che sto ottenendo

 QueryException in Connection.php line 713: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'groups.user_id' in 'field list' (SQL: select `tasks`.*, `groups`.`user_id` from `tasks` inner join `groups` on `groups`.`id` = `tasks`.`group_id` where `groups`.`user_id` = 1) 

La mia ipotesi è che ciò stia accadendo perché si aspetta una relazione uno-a-molti, ma ho una relazione molti-a-molti.

Quindi esiste un modo per recuperarlo senza get tutti i gruppi e quindi eseguirne il looping?

 User Model public function groups() { return $this->belongsToMany('App\Group'); } Group Model public function tasks() { return $this->belongsToMany('App\Task'); } Task Model public function groups() { return $this->belongsToMany('App\Group'); } 

Recupero di tutte le attività per un utente.

 $user = User::find(1); $user->load('groups.tasks'); $tasks = $user->groups->pluck('tasks')->collapse();