Já criamos os arquivos de Migrations e também criamos as rotas, models e controllers do nosso sistema financeiro. Agora nós vamos identificar os relacionamentos nos arquivos pertinentes.
Abaixo eu descrevo a lista de tabelas e seus relacionamentos do nosso banco de dados:
- Knowledge
- Plans
- Roles
- Parameters- plans_id => Plans
 
- Users
- Users_Parameters (Tabela de relacionamento)- users_id => Users
- parameters_id => Parameters
- roles_id => Roles
 
- Account_Plans- parameters_id => Parameters
- plangroup => Account_Plans
 
- Costs- parameters_id => Parameters
 
- Document_Types- parameters_id => Parameters
 
- Event_Types- parameters_id => Parameters
 
- Banks- parameters_id => Parameters
 
- Boxes- parameters_id => Parameters
 
- Cards- parameters_id => Parameters
 
- Customers- parameters_id => Parameters
 
- Providers- parameters_id => Parameters
 
- Plannings- parameters_id => Parameters
- costs_id => Costs
- providers_id => Providers
- customers_id => Customers
- account_plans_id => AccountPlans
 
- Transfers- parameters_id => Parameters
- banks_id => Banks
- boxes_id => Boxes
- costs_id => Costs
- event_types_id => Event_Types
- document_types_id => Document_Types
- account_plans_id => Account_Plans
- banks_dest => Banks
- boxes_dest => Boxes
- costs_dest => Costs
- account_plans_dest => Account_Plans
 
- Movements- parameters_id => Parameters
- banks_id => Banks
- boxes_id => Boxes
- cards_id => Cards
- plannings_id => Plannings
- costs_id => Costs
- event_types_id => Event_Types
- document_types_id => Document_Types
- providers_id => Providers
- customers_id => Customers
- account_plans_id => Account_Plans
 
- Movement_Checks- parameters_id => Parameters
 - banks_id => Banks
 - boxes_id => Boxes
 - costs_id => Costs
 - event_types_id => Event_Types
 - providers_id => Providers
 - customers_id => Customers
 - account_plans_id => Account_Plans
 - transfers_id => Transfers
 - movements_id => Movements
 
- Movement_Banks- parameters_id => Parameters
- banks_id => Banks
- costs_id => Costs
- event_types_id => Event_Types
- document_types_id => Document_Types
- providers_id => Providers
- customers_id => Customers
- account_plans_id => Account_Plans
- transfers_id => Transfers
- movements_id => Movements
- movement_checks_id => Movement_Checks
 
- Movement_Boxes- parameters_id => Parameters
- boxes_id => Boxes
- costs_id => Cards
- event_types_id => Event_Types
- providers_id => Providers
- customers_id => Customers
- account_plans_id => Account_Plans
- transfers_id => Transfers
- movements_id => Movements
- movement_checks_id => Movement_Checks
 
- Movement_Cards- parameters_id => Parameters
- banks_id => Banks
- boxes_id => Boxes
- cards_id => Cards
- costs_id => Costs
- event_types_id => Event_Types
- providers_id => Providers
- customers_id => Customers
- document_types_id => Document_Types
- account_plans_id => Account_Plans
- movements_id => Movements
 
- Movements_Movement_Cards (Tabela de relacionamento)- parameters_id => Parameters
- movements_id => Movements
- cards_id => Cards
 
- Movement_Mergeds (Tabela de relacionamento)- parameters_id => Parameters
- movements_id => Movements
- movements_merged => Movements
 
- Movement_Recurrents (Tabela de relacionamento)- parameters_id => Parameters
- movements_id => Movements
- movement_cards_id => Movement_Cards
 
- Balances- parameters_id => Parameters
- banks_id => Banks
- boxes_id => Boxes
- cards_id => Cards
- plannings_id => Plannings
 
- Regs- parameters_id => Parameters
- users_id => Users
 
Vamos alterar o arquivo Model de Plans e criar o relacionamento com a tabela Parameters. Abra o arquivo ‘app/Plan.php’ e deixe-o como no exemplo abaixo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Plan extends Model
{
    protected $table = 'plans';
    
    public function parameter()
    {
	return $this->hasOne(Plan::class, foreignKey: 'plans_id', localKey: 'id');
    }
}Para exibir os dados da consulta, o arquivo Controller em ‘app/Http/Controllers/PlanController.php’ deverá conter as seguintes linhas:
<?php
namespace App\Http\Controllers;
use App\Parameter;
use Illuminate\Http\Request;
class PlanController extends Controller
{
    ...
    public function show($id)
    {
	//Consulta o dado pelo ID
        $plan = Plan::where('id', $id)->first();
        
        if (!empty($plan)) {
	        
	        //Consulta os perfis que utilizam o plano
	        $parameters = $plan->parameter()->get();
	        
	        if (!empty($parameters)) {
		        
		        //Envie para a View os dados da consulta
		        
	        }//if (!empty($parameters))
	        
        }//if (!empty($plan))
    }
    ...
}Agora vamos realizar a pesquisa reversa. Abra o Model de Parameters em ‘app\Parameter.php’ e escreva as seguintes linhas:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Parameter extends Model
{
    protected $table = 'parameters';
    
    public function plan()
    {
	    $this->belongsTo(Plan::class, ForeignKey: 'plans_id', ownerKey: 'id');
    }
}No Controller de Parameters em ‘app/Http/Controllers/ParameterController.php’, é possível listar o plano do perfil. É necessário que ele se pareça com o exemplo abaixo:
<?php
namespace App\Http\Controllers;
use App\Parameter;
use Illuminate\Http\Request;
class ParameterController extends Controller
{
    ...
    public function show($id)
    {
	//Consulta o dado pelo ID
        $parameter = Parameter::where('id', $id)->first();
        
        if (!empty($parameter)) {
	        
	        //Consulta o plano do perfil atual
	        $plan = $parameter->plan()->first();
	        
	        if (!empty($plan)) {
		        
		        //Envie para a View os dados da consulta
		        
	        }//if (!empty($plan))
	        
        }//if (!empty($parameter))
    }
    ...
}RESUMO
Então, agora vamos resumir o que foi feito para facilitar a compreensão.
Model Principal 
(aquele que teve seu id referenciado como foreign key)
public function nome_da_tabela_referenciadora()
{
    return $this->hasOne(Plan::class, foreignKey: 'foreignKey_id', localKey: 'id');
}Controller Principal
(aquele que teve seu id referenciado como foreign key)
public function show($id)
{
    //Consulta os dados da tabela atual
    $tabela_atual = Tabela_atual::where('id', $id)->first();
    //Consulta os dados na tabela referenciadora
    $resultado_da_tabela_referenciadora = $tabela_atual->nome_da_tabela_referenciadora()->first();
    //Exibe os dados na tela
    dd($resultado_da_tabela_referenciadora);
}Model Referenciador
(aquele que possui a foreign key apontando para a tabela principal)
public function nome_da_tabela_principal()
{
    $this->belongsTo(Plan::class, ForeignKey: 'foreignKey_id', ownerKey: 'id');
}Controller Referenciador
(aquele que possui a foreign key apontando para a tabela principal)
public function show($id)
{
    //Consulta os dados da tabela atual
    $tabela_atual = Tabela_atual::where('id', $id)->first();
    //Consulta os dados da tabela principal
    $resultado_da_tabela_principal = $tabela_atual->nome_da_tabela_principal()->first();
    //Exibe os dados na tela
    dd($resultado_da_tabela_principal);
}O que muda entre os relacionamentos 1:1, 1:N e N:N?
1:1 Model
$this->hasOne(Tabela_relacionada::class, foreignKey: 'chave_estrangeira_id', localKey: 'id');1:1 Controller
$tabela_atual->tabela_relacionada()->first();1:N Model
$this->hasMany(Tabela_relacionada::class, ForeignKey: 'chave_estrangeira_id', localKey: 'id');1:N Controller
$tabela_atual->tabela_relacionada()->get(); 
//Use um laço de repetição para ler o retornoModel de retorno para 1:1 e 1:N:
$this->belongsTo(Tabela_relacionada::class, ForeignKey: 'chave_estrangeira_id', ownerKey: 'id');N:N Model
$this->belongsToMany(Tabela_relacionada::class, Table: 'tabela_de_relacionamentos', ForeignPivotKey: 'tabela_atual_id', relatedPivotKey: 'tabela_relacionada_id');N:N Controller
$tabela_atual->tabela_relacionada()->get(); 
//Use um laço de repetição para ler o retornoAs regras acima foram aplicadas nos arquivos do nosso projeto. A documentação completa está em https://laravel.com/docs/7.x/eloquent-relationships.
Esse projeto possui todo o código disponível em https://github.com/Maksoud/reiniciando e o projeto está hospedado em https://reiniciando.maksoud.dev/. Deixe seu comentário abaixo e colabore com esse projeto.
