Laravel 5.2 - Fazer Relacionamento Many To Many Entre Registros De Uma Mesma Tabela

by ADMIN 84 views

Introdução

Ao trabalhar com banco de dados em aplicações web, é comum precisar de relacionamentos complexos entre tabelas. No caso específico da aplicação que estamos desenvolvendo, precisamos criar um relacionamento Many To Many entre registros de uma mesma tabela, ou seja, entre usuários e funções. Neste artigo, vamos explorar como fazer isso utilizando o framework Laravel 5.2 e o Eloquent.

Tabelas e Relacionamentos

Antes de começarmos, é importante entender as tabelas envolvidas e o relacionamento que precisamos criar. As tabelas são:

  • users: registra usuários que podem ter N funções que são armazenadas na tabela funcoes (aluno, responsavel, professor, etc).
  • funcoes: armazena as funções disponíveis para os usuários.
  • funcao_user: é o pivot que faz o relacionamento entre usuários e funções.

O relacionamento entre as tabelas é Many To Many, pois um usuário pode ter várias funções e uma função pode ser atribuída a vários usuários.

Criando a Tabela Pivot

Para criar a tabela pivot, precisamos criar uma migration que crie a tabela funcao_user. Abra o terminal e execute o comando abaixo:

php artisan make:migration create_funcao_user_table

Isso criará um arquivo de migration em database/migrations. Abra o arquivo e adicione o seguinte código:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class CreateFuncaoUserTable extends Migration /** * Run the migrations. * * @return void */ public function up() { Schema:create('funcao_user', function (Blueprint $table) { $table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users'); $table->integer('funcao_id')->unsigned(); $table->foreign('funcao_id')->references('id')->on('funcoes'); $table->primary(['user_id', 'funcao_id']); ); }

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('funcao_user');
}

}

Este código cria a tabela funcao_user com as colunas user_id e funcao_id, que são as chaves estrangeiras para as tabelas users e funcoes, respectivamente. Além disso, define a chave primária como um índice composto das duas colunas.

Executando a Migracao

Para executar a migration, execute o comando abaixo:

php artisan migrate

Definindo o Relacionamento no Modelo

Agora que a tabela pivot foi criada, precisamos definir o relacionamento no modelo. Abra o arquivo app/Models/User.php e adicione o seguinte código:

namespace App\Models;

use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class User extends Model /** * @return BelongsToMany */ public function funcoes() BelongsToMany { return $this->belongsToMany(Funcao::class, 'funcao_user', 'user_id', 'funcao_id'); }

Este código define o relacionamento Many To Many entre o modelo User e o modelo Funcao, utilizando a tabela pivot funcao_user.

Definindo o Relacionamento no Modelo de Funcao

Abra o arquivo app/Models/Funcao.php e adicione o seguinte código:

namespace App\Models;

use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Funcao extends Model /** * @return BelongsToMany */ public function usuarios() BelongsToMany { return $this->belongsToMany(User::class, 'funcao_user', 'funcao_id', 'user_id'); }

Este código define o relacionamento Many To Many entre o modelo Funcao e o modelo User, utilizando a tabela pivot funcao_user.

Exemplo de Uso

Agora que o relacionamento está definido, podemos usar o Eloquent para acessar os dados. Por exemplo, podemos obter todos os usuários que têm uma determinada função:

$usuarios = User::whereHas('funcoes', function ($query) {
    $query->where('nome', 'professor');
})->get();

Este código utiliza a cláusula whereHas para obter todos os usuários que têm uma função com o nome "professor".

Conclusão

Pergunta 1: O que é um relacionamento Many To Many?

Resposta: Um relacionamento Many To Many é um tipo de relacionamento entre tabelas que permite que um registro de uma tabela seja relacionado a vários registros de outra tabela, e vice-versa.

Pergunta 2: Por que preciso de uma tabela pivot?

Resposta: A tabela pivot é necessária para armazenar as chaves estrangeiras das duas tabelas que estão relacionadas. Ela serve como um "pivô" entre as duas tabelas, permitindo que os registros sejam relacionados de forma Many To Many.

Pergunta 3: Como criar uma tabela pivot em Laravel 5.2?

Resposta: Para criar uma tabela pivot em Laravel 5.2, você precisa criar uma migration que crie a tabela pivot. Em seguida, você precisa definir as chaves estrangeiras e a chave primária da tabela pivot.

Pergunta 4: Como definir o relacionamento no modelo?

Resposta: Para definir o relacionamento no modelo, você precisa usar a classe BelongsToMany do Eloquent. Essa classe permite que você defina o relacionamento Many To Many entre dois modelos.

Pergunta 5: Como usar o Eloquent para acessar os dados?

Resposta: Para usar o Eloquent para acessar os dados, você precisa usar as classes User e Funcao para acessar os registros relacionados. Você também pode usar as cláusulas whereHas e whereDoesntHave para filtrar os registros.

Pergunta 6: O que é a cláusula whereHas?

Resposta: A cláusula whereHas é uma cláusula do Eloquent que permite que você filtre os registros que têm um relacionamento com outro modelo.

Pergunta 7: O que é a cláusula whereDoesntHave?

Resposta: A cláusula whereDoesntHave é uma cláusula do Eloquent que permite que você filtre os registros que não têm um relacionamento com outro modelo.

Pergunta 8: Como usar a cláusula whereHas para filtrar os registros?

Resposta: Para usar a cláusula whereHas para filtrar os registros, você precisa usar a classe User e a cláusula whereHas para filtrar os registros que têm um relacionamento com outro modelo.

Pergunta 9: Como usar a cláusula whereDoesntHave para filtrar os registros?

Resposta: Para usar a cláusula whereDoesntHave para filtrar os registros, você precisa usar a classe User e a cláusula whereDoesntHave para filtrar os registros que não têm um relacionamento com outro modelo.

Pergunta 10: O que é o Eloquent?

Resposta: O Eloquent é um sistema de gerenciamento de objetos relacionais (ORM) que permite que você interaja com o banco de dados de forma mais fácil e eficiente.

Conclusão

Neste artigo, respondemos a 10 perguntas frequentes sobre relacionamentos Many To Many em Laravel 5.2. Esperamos que as respostas tenham ajudado a esclarecer suas dúvidas e a entender melhor como funciona o relacionamento Many To Many em Laravel 5.2.