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

13 respostas Resolvido
laravel
Cleiton_Conceicao

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

Dragoon

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

Cleiton_Conceicao

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
Cleiton_Conceicao

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',
    ];
}
Dragoon

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

Cleiton_Conceicao

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

Dragoon

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

Cleiton_Conceicao

é 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);
Dragoon

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');
Cleiton_Conceicao

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

Dragoon

É 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:

Cleiton_Conceicao

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.

Cleiton_Conceicao

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

Cleiton_Conceicao
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