En mi proyecto laravel tengo las tablas que se muestran a continuación.
los groups y users están en una relación Muchos a Muchos, lo que significa que un usuario puede pertenecer a varios grupos.
La tabla group_user es una tabla intermedia que representa qué usuario pertenece a qué grupo.
La tabla slot_votes registra el voto de los usuarios en el espacio. Su relación con la tabla de groups es la tabla de groups hasMany slot_votes .
mesa de groups
|id | channel_id | +---+---------+ |1 | U124 | |2 | U123 | |3 | U125 | |4 | U127 | tabla de users
|id | name | +---+---------+ |1 | A | |2 | B | |3 | C | |4 | D | tabla group_user
|id | group_id | user_id | +---+----------+-----------+ |1 | 1 | 1 | |2 | 2 | 1 | |3 | 2 | 2 | |4 | 3 | 3 | |5 | 4 | 3 | |6 | 1 | 4 | tabla slot_vote
|id | user_id | group_id | slot | +---+---------+-----------+-----------+ |1 | 1 | 1 | A | |2 | 2 | 1 | B | |3 | 2 | 2 | C | |1 | 1 | 4 | C |Mi pregunta es ¿cómo puedo usar Laravel Eloquent para obtener las identificaciones de grupo en las que votaron todos sus miembros?
Por ejemplo, si los miembros del grupo 1 son $userId = [1, 4] y tanto el usuario 1 como el 4 votaron (por lo tanto, existe en la tabla slot_votes), quiero obtener la identificación del grupo 1 en el resultado.
Lo que he probado:
Group::whereHas('users', function ($query, $votedUser) { $query->whereIn( 'id', SlotVote::where('group_id', $groupId)->pluck('user_id')->unique() ); }, '=', count($votedUser))->get(); Pero no pude averiguar cómo obtener $groupId en la cláusula whereIn . Además, me preocupa el rendimiento de la consulta. ¿Alguna idea sobre cómo puedo obtener los resultados que necesito?
Gracias por adelantado.
Logré resolverlo usando el siguiente código:
Group::leftJoin('group_user', 'groups.id', '=', 'group_user.group_id') ->leftJoin('slot_votes', 'group_user.user_id', '=', 'slot_votes.user_id') ->selectRaw( "groups.id, channel_id, count(distinct group_user.user_id) as members, count(distinct slot_votes.user_id) as voted_members", ) ->groupBy('groups.id') ->havingRaw('members=voted_members') ->get();