[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Paulo Bueno
Criador Paulo Bueno 24/03/2022
Professor, boa noite.
 
Criei um sistema onde a estrutura é:
Usuários -> Workspaces
 
Workspaces possui muitos módulos -> Módulos possui muitas áreas (estou utilizando uma tabela pivot como o Sr ensinou)
Ex.:
// Lista de módulos do usuário
public function modules()
{
return $this->belongsToMany(
Module::class,
'pivot_users_module',
'user_id',
'module_id'
);
}
 
 
Ocorre que eu preciso pegar dentro do controller em parte da função abaixo o ID do Workspace (na função eu coloquei como 1)
 
O Objetivo é:
Buscar módulos que estão vinculados ao workspace e que o usuário atual
tenha vínculo a ele.
 
A função abaixo, está funcionando, porém não consigo transformar o (1) em workspace_id por ex...
 
Poderia me dar um Luz? (estou enviando abaixo o json contendo o mapa atual)
 
Fico previamente muito agradecido. (se precisar, gravo um vídeo rápido ou envio todo o código)
 
 
Parte da função:
 
$user->load(
[
'workspaces' => function ($query) use ($user) {

$query->with(
[
'modules' => function ($join) use ($user) {

$join->join('pivot_users_module', 'pivot_users_module.module_id', '=', 'system_modules.id')
->where('pivot_users_module.workspace_id', '=', '1') // Preciso que esse 1 seja o id do workspace (tipo )
->where('pivot_users_module.user_id', '=', $user->id);
},
]
);
},

]
)->get();
 
 
 
---------------------------------------------------------------
 
Mapa completo gerado de retorno (json)
 
{
"data": {
"id": 1,
"uuid": "ef397da1-61c6-4fd3-8214-c2acda513bca",
"name": "Paulo ",
"email": "[email protected]",
"avatar": "avatar_usuario",
"email_verified_at": null,
"created_at": "2022-03-24T16:45:46.000000Z",
"updated_at": "2022-03-24T16:45:46.000000Z",
"deleted_at": null,
"workspaces": [
{
"id": 1,
"uuid": "WORKSPACE1",
"name": "WORKSPACE1",
"description": "WORKSPACE1",
"avatar": "WORKSPACE1",
"created_at": null,
"updated_at": null,
"deleted_at": null,
"pivot": {
"user_id": 1,
"workspace_id": 1
},
"modules": [
{
"id": 1,
"uuid": "MODULO1",
"name": "MODULO1",
"created_at": null,
"updated_at": null,
"deleted_at": null,
"pivot": {
"workspace_id": 1,
"module_id": 1
}
}
]
},
{
"id": 2,
"uuid": "WORKSPACE2",
"name": "WORKSPACE2",
"description": "WORKSPACE2",
"avatar": "WORKSPACE2",
"created_at": null,
"updated_at": null,
"deleted_at": null,
"pivot": {
"user_id": 1,
"workspace_id": 2
},
"modules": []
}
]
},
"token": "27|Yfm3h4i5HStP25lR8Vp3tLWpZx1zehMuMV7U0mor"
}
Criador Paulo Bueno 24/03/2022

Olá professor, apenas para ajudar algum aluno que procure algo semelhante, resolve esse caso com uma função assim:

 

 

static function modules($user)
{

$workspaces = DB::table('pivot_users_workspace')
->join('system_workspaces', 'pivot_users_workspace.workspace_id', '=', 'system_workspaces.id')
->get();
$retorno = [];

foreach ($workspaces as $workspace) {

$modules = DB::table('pivot_users_module')
->join('system_modules', 'system_modules.id', '=', 'pivot_users_module.module_id')
->where('pivot_users_module.workspace_id', $workspace->id)
->get();

$retorno[] = [
'uuid' => $workspace->uuid,
'name' => $workspace->name,
'modules' => ModuleLoginResource::collection($modules ?? []),

];
}

return $retorno;
}
 
 
Basicamente estou fazendo várias consultas no banco de dados onde encontro a lista de Workspaces e depois vejo
se o usuário possui uma permissão (com outra SQL)
 
Essa não é a solução correta, porém resolve o problema.. (mas com muuuitas querys) se encontrar
algum dia outra solução posto por aqui...
 
 
Abraço a todos..
Paulo Bueno
Manager Carlos Ferreira 24/03/2022

Olá, Paulo!
Tudo bem?

Parabéns por ter conseguido resolver amigo.

Não acho uma boa estratégia fazer querys dentro de um loop, isso força demais o banco de dados, dependendo da quantidade de registros.

O seu código você copiou de algum lugar, veio cheio de formatação, ficou meio difícil de ler. Você tem no GitHub?

Tem o desenho do MER do banco? Isso ajuda demais eu te ajudar! :-)

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!