Pegar parâmetros da própria função que estão sendo executada
Criador
Paulo Bueno
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
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..
Manager
Carlos Ferreira
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! :-)
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!