Laravel Dúvida Relações DB

diogomfm

Power Member
Estou a criar uma espécie de aplicação para a gestão do torneios de badminton da minha escola.
Decidi usar a framework laravel e ando a ver uns tutoriais e até me ando a safar bem.
Tenho um pequeno problema. Já criei páginas para as escolas e para o jogadores. Criei uma relação entre as duas tabelas e esta tudo a funcionar. Agora queria quando abrisse a página da escola X mostra-se todos os jogadores apenas dessa mesma escola, mas apenas consigo mostrar os jogadores de todos de todas as escolas.
Deixo aqui o código, preciso mesmo de ajuda.

EscolaController

<?php

namespace App\Http\Controllers;


use Illuminate\Http\Request;
use App\Http\Requests;
use App\escola;
use App\jogador;
use Session;

class EscolaController extends Controller
{
public function __construct(){
$this->middleware('auth');
}
/**
* Display a listing of the resource.
*
* @Return \Illuminate\Http\Response
*/
public function index()
{
$escolas=Escola::orderBy('created_at', 'asc')->paginate(10);
return view('escolas.index')->with('escolas', $escolas);
}

/**
* Show the form for creating a new resource.
*
* @Return \Illuminate\Http\Response
*/
public function create()
{
return view('escolas.create');
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @Return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, array(
'Nome_escola'=>'required',
'Local'=>'required',
'Nome_contacto'=>'required',
'Contacto_telefone'=>'required|numeric',
'Contacto_email'=>'required|email',
'slug'=>'required|alpha_dash'
));

$escola=new escola;

$escola->Nome_escola = $request->Nome_escola;
$escola->Local = $request->Local;
$escola->Nome_contacto = $request->Nome_contacto;
$escola->Contacto_telefone = $request->Contacto_telefone;
$escola->Contacto_email = $request->Contacto_email;
$escola->Obs_escola = $request->Obs_escola;
$escola->slug = $request->slug;

$escola->save();

Session::flash('success', 'A escola foi adicionada!');

return redirect()->route('escolas.show', $escola->id);
}

/**
* Display the specified resource.
*
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function show($id)
{
$escola = Escola::find($id);
$jogador= jogador::all();
return view('escolas.show')->with('escola', $escola)->with('jogador', $jogador);
}

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function edit($id)
{
$escola = Escola::find($id);
return view('escolas.edit')->with('escola', $escola);
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate($request, array(
'Nome_escola'=>'required',
'Local'=>'required',
'Nome_contacto'=>'required',
'Contacto_telefone'=>'required|numeric',
'Contacto_email'=>'required|email',
'Obs_escola'=>'required',
'slug'=>'required|alpha_dash'
));

$escola=Escola::find($id);

$escola->Nome_escola = $request->input('Nome_escola');
$escola->Local = $request->input('Local');
$escola->Nome_contacto = $request->input('Nome_contacto');
$escola->Contacto_telefone = $request->input('Contacto_telefone');
$escola->Contacto_email = $request->input('Contacto_email');
$escola->Obs_escola = $request->input('Obs_escola');
$escola->slug = $request->input('slug');

$escola->save();

Session::flash('success', 'As alterações foram guardadas!');

return redirect()->route('escolas.show', $escola->id);
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function destroy($id)
{
$escola=Escola::find($id);
$escola->delete();
Session::flash('success', 'A escola foi apagada!');
return redirect()->route('escolas.index');
}
}

JogadorController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\jogador;
use App\escola;
use Session;

class JogadorController extends Controller
{
public function __construct(){
$this->middleware('auth');
}
/**
* Display a listing of the resource.
*
* @Return \Illuminate\Http\Response
*/
public function index()
{
$jogador=jogador::orderBy('created_at', 'asc')->paginate(10);
return view('jogadors.index')->with('jogador', $jogador);
}

/**
* Show the form for creating a new resource.
*
* @Return \Illuminate\Http\Response
*/
public function create()
{
$escolas=escola::all();
return view('jogadors.create')->withEscolas($escolas);
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @Return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, array(
'Nome_jogador'=>'required',
'Data_nascimento'=>'required',
'Genero'=>'required',
'escolas_id'=>'required|integer',
'Contacto_telefone'=>'required|numeric',
'Contacto_email'=>'required|email',
'Pontos_ranking'=>'required|numeric',
'Posiçao_ranking'=>'required|numeric',
'slug'=>'required|alpha_dash|unique:jogadors,slug'
));

$jogador=new jogador;

$jogador->Nome_jogador = $request->Nome_jogador;
$jogador->Data_nascimento = $request->Data_nascimento;
$jogador->Genero = $request->Genero;
$jogador->escolas_id = $request->escolas_id;
$jogador->Contacto_telefone = $request->Contacto_telefone;
$jogador->Contacto_email = $request->Contacto_email;
$jogador->Pontos_ranking = $request->Pontos_ranking;
$jogador->Posiçao_ranking = $request->Posiçao_ranking;
$jogador->Obs_jogador = $request->Obs_jogador;
$jogador->slug = $request->slug;

$jogador->save();

Session::flash('success', 'O jogador(a) foi adicionado(a)!');

return redirect()->route('jogadors.show', $jogador->id);
}

/**
* Display the specified resource.
*
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function show($id)
{
$jogador = jogador::find($id);
return view('jogadors.show')->with('jogador', $jogador);
}

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function edit($id)
{
$jogador = jogador::find($id);
$escolas=escola::all();
return view('jogadors.edit')->with('jogador', $jogador)->withEscolas($escolas);
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate($request, array(
'Nome_jogador'=>'required',
'Data_nascimento'=>'required',
'Genero'=>'required',
'escolas_id'=>'required|integer',
'Contacto_telefone'=>'required|numeric',
'Contacto_email'=>'required|email',
'Pontos_ranking'=>'required|numeric',
'Posiçao_ranking'=>'required|numeric',
'slug'=>'required|alpha_dash'
));

$jogador=jogador::find($id);

$jogador->Nome_jogador = $request->input('Nome_jogador');
$jogador->Data_nascimento = $request->input('Data_nascimento');
$jogador->Genero = $request->input('Genero');
$jogador->escolas_id = $request->input('escolas_id');
$jogador->Contacto_telefone = $request->input('Contacto_telefone');
$jogador->Contacto_email = $request->input('Contacto_email');
$jogador->Pontos_ranking = $request->input('Pontos_ranking');
$jogador->Posiçao_ranking = $request->input('Posiçao_ranking');
$jogador->Obs_jogador = $request->input('Obs_jogador');
$jogador->slug = $request->input('slug');

$jogador->save();

Session::flash('success', 'As alterações foram guardadas!');

return redirect()->route('jogadors.show', $jogador->id);
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @Return \Illuminate\Http\Response
*/
public function destroy($id)
{
$jogador=jogador::find($id);
$jogador->delete();
Session::flash('success', 'O(A) jogador(a) foi apagado(a)!');
return redirect()->route('jogadors.index');
}
}

Escola Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Schema;

class escola extends Model
{
protected $table = 'escolas';

public function jogadors()
{
return $this->hasMany('App\jogador');
}
}

Jogador Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class jogador extends Model
{
public function escolas()
{
return $this->belongsTo('App\escola');
}
}

Escola View

@extends('main')

@section('title', 'Ver Escola')

@section('content')
<div class="row">
<h2>Informações da Escola</h2>
<div class="col-md-8">
<table class="table table-bordered">
<tbody>
<tr>
<td width="200"><strong>Nome da Escola: </strong></td>
<td>{{$escola->Nome_escola}}</td>
</tr>
<tr>
<td><strong>Local: </strong></td>
<td>{{$escola->Local}}</td>
</tr>
<tr>
<td><strong>Nome do Contacto: </strong></td>
<td>{{$escola->Nome_contacto}}</td>
</tr>
<tr>
<td><strong>Contacto de Telefone: </strong></td>
<td>{{$escola->Contacto_telefone}}</td>
</tr>
<tr>
<td><strong>Contacto de Email: </strong></td>
<td>{{$escola->Contacto_email}}</td>
</tr>
<tr>
<td><strong>Observações: </strong></td>
<td>{{$escola->Obs_escola}}</td>
</tr>
</tbody>
</table>
</div>
<div class="col-md-4">
<div class="well">
<dl class="dl-horizontal">
<label>URL Público:</label>
<p><a href="{{url("escolasinscritas/$escola->slug")}}">{{url("escolasinscritas/$escola->slug")}}</a></p>
</dl>
<dl class="dl-horizontal">
<label>Criado a:</label>
<p>{{date('d/m/Y, H:i', strtotime($escola->created_at))}}</p>
</dl>
<dl class="dl-horizontal">
<label>Editado a:</label>
<p>{{date('d/m/Y, H:i', strtotime($escola->updated_at))}}</p>
</dl>
<hr>
<div class="row">
<div class="col-sm-6">
{!!Html::linkRoute('escolas.edit', 'Editar', array($escola->id), array('class'=>'btn btn-primary btn-block')) !!}
</div>
<div class="col-sm-6">
{!!Form::open(['route'=>['escolas.destroy', $escola->id], 'method'=>'DELETE'])!!}
{{Form::submit('Apagar', ['class'=>'btn btn-danger btn-block'])}}
{!!Form::close()!!}
</div>
</div>
<div class="row">
<div class="col-md-12">
{{ Html::linkRoute('escolas.index', 'Ver todas as escolas', array(), ['class' => 'btn btn-default btn-block btn-h2-spacing']) }}
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10">
<h2>Jogadores(as) da Escola</h2>
</div>
<div class="col-md-12">
<hr>
</div>
</div>
<div class="row">
<div class="col-md-12">
<table class="table table-bordered">
<thead>
<th>Nome</th>
<th>Data de Nascimento</th>
<th>Escola</th>
<th class="text-center">Ações</th>
</thead>
<tbody>
@foreach($jogador as $jogador)
<tr>
<td>{{$jogador->Nome_jogador}}</td>
<td>{{$jogador->Data_nascimento}}</td>
<td>{{$jogador->escolas->Nome_escola}}</td>
<td class="text-center"><a href="{{route('jogadors.show', $jogador->id)}}" class="btn btn-default btn-sm">Ver</a> <a href="{{route('jogadors.edit', $jogador->id)}}" class="btn btn-default btn-sm">Editar</a></td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endsection
 
Bem, não sou nenhum expert nisto mas posso tentar ajudar :)

No teu controlador estás a passar todos os jogadores para a vista

$jogador= jogador::all();

A minha sugestão é ou fazeres uma query para ires buscar só os jogadores pertencentes à escola que estás a mostrar, ou seja,
$jogadores = DB::Table('jogadores')->where('id_escola',$idEscola)->get();

Ou então na vista podes aceder diretamente aos jogadores de 1 certa escola caso tenhas feito a relação bem, e no foreach onde estás a mostrar os jogadores fazes

@foreach($escola->jogadores as $jogador)

(...)

@endforeach

Ou se quiseres aproveitar o que tu já tens vais apenas ao teu foreach e logo aseguir ao mesmo fazes um if do género

@foreach($jogador as $jogador)
@if($jogador->escola_id == $escola->id)

@endif

@endforeach

Espero ter ajudado
 
Back
Topo