Laravel - É possível fazer um join no model?

13 respostas Resolvido
laravel
C

acho loucura mais…vai que existe? kk
preciso fazer um join da tabela users com a tabela empresas, para assim conseguir pegar o campo chave da empresa e armazenar na sessão.
é possível? caso não seja possível, qual a melhor forma de armazenar o código da empresa na sessão?

13 Respostas

D

Sim é possível! agora precisamos saber tudo que está em volta!

C

Estou usando aquele login padrão do laravel, as sessions criado por ele é baseado no model? porque se for creio eu que será possível criar uma variável de sessão com o id da empresa, eu preciso de relacionar as tabelas.

Exemplo:

SELECT * FROM USERS INNER JOIN EMPRESAS ON 
USERS.ID=EMPRESAS.USR_CODIGO
C

Meu model está assim…

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */ 
    protected $fillable = [
        'id','name', 'email', 'password','username','usr_perfil',
        'usr_acesso_dashboard','usr_acesso_cadastro_pessoas','usr_acesso_cadasto_gerais',
        'usr_acesso_relatorios','usr_acesso_prontuario','usr_acesso_configuracoes','usr_acesso_cadusuarios','usr_ativo','usr_acesso_consultas'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}
D

Nem precisa de um join:

//recupera o usuário
$user = Auth::user();
//recupera a empresa
$empresa = Empresa::where('usr_codigo', $user->id)->first();
//ou
$empresa = \DB::table("empresas")->where('usr_codigo', $user->id)->first();

Ai você tem os dados da empresa mediante o código do usuário logado.

Se você tivesse feito a relação na classe User também sanava essa parte de recuperação

C

isso ficaria onde? no próprio model USER?
ou teria que utilizar nos controllers mesmo?

D

Você precisa colocar isso na parte de autenticação do usuário, quando ele acabar de autenticar você usa o id do usuário logado e escreve essa builder e já guarda na session o id da empresa

C

é assim que se cria a varável de sessão em Laravel?

$user = Auth::user();
$empresa = Empresa::where('usr_codigo', $user->id)->first();
$empresa = \DB::table("empresas")->where('usr_codigo', $user->id)->first();
Session::get($empresa);
D

Na documentação explica como é que armazena valores em uma sessão, exemplo:

// Via a request instance...
$request->session()->put('key', 'value');

// Via the global helper...
session(['key' => 'value']);

No seu caso:

$user = Auth::user();
$empresa = Empresa::where('usr_codigo', $user->id)->first();
$empresa = \DB::table("empresas")->where('usr_codigo', $user->id)->first();
session(['empresa_id' => $empresa->id]);

Para recuperar:

$value = session('empresa_id');
C

Li em outro fórum que o Controller VerificantionController é onde valida o usuário, não está funcionando estou tentando exibir o retorno na View mas não aparece, só o nome da varável…

O método onde autentica está assim, o padrão do Laravel.

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('signed')->only('verify');
    $this->middleware('throttle:6,1')->only('verify', 'resend');
    $user = Auth::user();
    //$empresa = Empresa::where('usr_codigo', $user->id)->first();
    $empresa = \DB::table("empresas")->where('usr_codigo', $user->id)->first();
    session(['empresa_id' => $empresa->id]);
}

e na View eu chamo chamo a variável de sessão assim…

Session::get($empresa);

Porém ele retorna o próprio nome da variável

image

D

É uma pena que você não está aprendendo Laravel, eu disse assim pra você na hora que loga, você coloca o código, você não entendeu.
Bom deixa eu explicar novamente, sabe o botão da tela de login, aonde você digita usuário e senha e ele cai num método do controller é ali que você faz isso e não no construtor dessa classe, porque se não ele vai ficar reescrevendo e isso não é bom…

Ratificando: no login do usuário aonde ele digita usuário e senha e aperta o botão de entrar, ele cai em um método e nesse método que você faz isso …

Falta atenção eu coloquei o código de recuperar a sessão se passou uma variável nela … :frowning:

C

estou aplicando o que vc me falou em um controller que eu mesmo criei pra pelo menos quero ver funcionando. pq o método padrão de autentificação do laravel é muito confuso, era por isso que não queria utiliza-lo. não sei qual o método que devo aplicar essa lógica.

mas, enfim! como faço para obter o valor da varável de sessão e exibir na view? só estou tentando descobrir se está funcionando antes de fazer exatamente o que eu preciso.

C

conseguir entender, como funciona! quando tiver tudo ok eu dou um retorno.

C
Solucao aceita

Resolvido galera!

Dentro do Controller LoginController nele possui o trate do PHP que é o use AuthenticatesUsers, aí dentro dessa classe eu criei o método authenticated.

Vlw pela força @Dragoon, me ajudou bastante!

public function authenticated($request, $usuario){
    $user = Auth::user();
    $empresa = \DB::table("empresa_usuarios")
                 ->where('emp_codigo', $user->id)
                 ->first();
    session(['empresa_id' => $empresa->emp_codigo]); 
}
Criado 26 de abril de 2019
Ultima resposta 27 de abr. de 2019
Respostas 13
Participantes 2