Relacionamento - Minha grande dúvida
Carlos, bom dia.
Por favor me ajude nisto.
Eu tenho uma tabela de equipes e uma tabela de participantes.
Criei ua tabela central onde tem os atributos equipe_id e participantes_id
Na model Equipeparticipantes estou fazendo
class EquipeParticipantes extends Model
{
protected $fillable = ['equipe_id', 'participante_id'];
static $rules = [
'equipe_id' => 'required',
'participante_id' => 'required'
];
public function participante()
{
return $this->belongsTo(Participante::class);
}
public function equipe()
{
return $this->belongsTo(Equipe::class);
}
Está correto? Coo ficaria no controller e na listagem view index?
Origado.
Olá, Marcos!
Ajudo sim amigo.
Quando tiver dúvidas sobre algo relacionado a relacionamento de tabelas, procura postar a dúvida em aulas afins, para que outros alunos com a mesma dificuldade possam se beneficiar da sua dúvida também.
No curso de Relacionamento de tabelas no Laravel ensino como trabalhar com uma tabela pivô, ou seja, como uma tabela adicional relaciona dados de outras duas: https://academy.especializati.com.br/curso/laravel-relacionamentos-tabelas-gratis
A tabela pivô não precisa nem deve ter um Model para ela.
Ah, mas como busco ou relaciono os dados entre equipe e participantes?
No Model Equipe você cria um método que relaciona com os participantes, e no model Participante criar um método que relaciona com as equipes.
Veja um exemplo do relacionamento Many to Many no Model Participante:
public function equipes()
{
// Não esquece: use App\Models\Equipe;
return $this->belongsToMany(Equipe::class);
}
Se não tiver criado a estrutura da tabela pivô com os padrões recomendados (igual ensino no curso) deve especificar os dados, assim:
public function equipes()
{
// Não esquece: use App\Models\Equipe;
return $this->belongsToMany(Equipe::class, 'nome_tabela_pivo', 'participante_id', 'equipe_id');
}
Como faço para listar as equipes de um participante?
No curso ensino isso também...
$participante = Participante::where('id', $id)->get()->first();
$equipes = $participante->equipes;
Qualquer dúvida amigo, me retorna. Tá bom?
Carlos, boa tarde.
u tenho colocado no forum em vez das auldas porque está dando mensagem que só cabem 1000 caracteres, mesmo não tendo tantos.
Eu refiz minha tabela pivô. Nome equipe_participantes.
Model com os campos:
class EquipeParticipantes extends Model
{
protected $fillable = ['equipe_id', 'participante_id', 'lider_id', 'vicelider_id'];
static $rules = [
'equipe_id' => 'required',
'participante_id' => 'required',
'lider_id' => 'required',
'vicelider_id' => 'required'
];
Então o que eu preciso é relacionar com as tabelas de equipes, participantes, lideres e vicelideres para trazer nomes e outros dados.
Pode me ajudar com este relacionamento e como coloco no controler e na view?
Obrigado,
Sempre dá a mensagem: "Property [equipes] does not exist on this collection instance."
Olá, Marcos!
Entendi, vou mudar a quantidade de caracteres permitidos, para pode postar mais detalhes :-)
Voltando a sua dúvida, reforço: Um tabela pivô não precisa de Model.
O relacionamento é N:N, e a tabela equipe_participantes serve apenas como pivô, certo?
Não precisa criar um Model para essa tabela.
Até "funciona", mas, neste caso você foge dos padrões do Laravel e perde a chance de se beneficiar dos recursos do Eloquent para manipulação de dados em bases relacionadas.
Quando tem um Model que a tabela é diferente do próprio nome no plural precisa especificar o nome da tabela, veja: https://blog.especializati.com.br/especificar-nome-da-tabela-no-model-do-laravel/
O que você precisa fazer é no Model "Equipe" criar o relacionamento N:N (Many to Many) com Participantes.
E no Model Participante criar o relacionamento N:N (Many to Many) com Equipes.
Ah, mas como mostro os participantes da equipe X, segue um exemplo:
#controller
$equipe = Equipe::where('id', '=', $idEquipe)->get()->first();
// ou: $equipe = Equipe::find($idEquipe);
// já trazendo o relacionamento: $equipe = Equipe::with('participantes')->find($idEquipe);
$participantes = $equipe->participantes;
// ou $participantes = $equipe->participantes->get();
Após isso pode pegar a variável $participantes e enviar para a view.
Ah, mas minha tabela pivô tem dados adicionais como faço para informar isso, veja o exemplo: https://laravel.com/docs/5.6/eloquent-relationships#updating-many-to-many-relationships
Seria algo assim:
$equipe = Equipe::find($idEquipe);
$equipe->participantes()->attach([
1 => ['lider_id' => 2, 'vicelider_id' => 1],
2 => ['lider_id' => 1, 'vicelider_id' => 2],
]);
Neste caso irá vincular os participantes 1 e 2 a equipe $idEquipe com as respectivas informações.
Qualquer dúvida amigo, me retorna. Tá bom? :-)
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!