Hoi,

Ik wil graag een Laravel app opzetten waarmee voetbalmatchen kunnen geraadpleegd worden. Kan iemand me helpen hoe ik best de relaties tussen de verschillende tabellen opbouw?

Tabel 1: Teams --> team_id (int), team_naam (varchar)

Tabel 2: Speeldagen --> speeldag_id (int), speeldag_van (date), speeldag_tot (date), speeldag_naam (varchar)

Tabel 3: Matches --> match_id (int), speeldag_id (int) LINK speeldagen.speeldag_id, hometeam_id (int) LINK teams.team_id, visitingteam_id (int) LINK teams.team_id

De uitdaging is hier dat in tabel matchen twee keer gelinkt wordt naar dezelfde tabel team.

Mijn vraag is: kan dit, en hoe bouw ik de relaties op?

Ik probeer dit in Laravel 5.2, kan iemand me op weg helpen met de opbouw van de MatchController?

Alvast bedankt!
Je kunt inderdaad twee keer een relatie met een andere tabel maken en zelfs ook met dezelfde tabel wanneer je dit nodig zou hebben. (Denk aan vrienden op sites als facebook).

Het uitwerken is niet al te moeilijk:

matches:
- id
- thuis_id --> many-to-one relatie met teams
- uit_id --> many-to-one relatie met teams

En natuurlijk dan even de beperkingen toevoegen:

--
-- Beperkingen voor tabel `matches`
--
ALTER TABLE `matches`
  ADD CONSTRAINT `FK_THUIS_TEAMS` FOREIGN KEY (`thuis_id`) REFERENCES `teams` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `FK_UIT_TEAMS` FOREIGN KEY (`uit_id`) REFERENCES `teams` (`id`) ON DELETE CASCADE;


ON DELETE CASCADE wil zeggen dat als je een team verwijderd uit de database dan worden ook de matches verwijderd waar het team aan mee doet of deed. Iets waar je eens goed over moet nadenken. Want een team kan opgeheven worden. Vaak wordt een team dan niet uit de database verwijderd omdat je dan met de oude wedstrijden waaraan ze deelgenomen hebben blijft zitten. In plaats hiervan wordt er een kolom met een naam als 'deleted' oid toegevoegd waarin dan een 1 komt te staan om aan te geven dat het team opgeheven is. Dit wordt ook nog wel eens een 'soft delete' genoemd. Voor de eindgebruiker wordt het team dan niet meer in de overzichten getoond maar het staat nog wel in de database.
Hoi Frank,

bedankt voor je hulp! Mag ik even verder vragen aub? :-)

hoe pas ik in Laravel dan mijn models aan?

ik heb een Match model en een Team model. Moet ik mijn Match model dan staan:


    public function homeTeam()
    {
        return $this->belongsTo('App\Team', 'home_team_id', 'id');
    }

    public function visitingTeam()
    {
        return $this->belongsTo('App\Team', 'visiting_team_id', 'id');
    } 


En wat zet ik dan in mijn Team model?
https://laravel.com/docs/5.1/eloquent-relationships#one-to-many

Ja zoiets inderdaad. Ik ben zelf geen Laravel gebruiker.

En in je Teams krijg je iets als:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Teams extends Model
{
/**
* Get the home-matches for this team.
*/
public function homeMatches()
{
return $this->hasMany('App\Match', 'home_team_id');
}

/**
* Get the out-matches for this team.
*/
public function outMatches()
{
return $this->hasMany('App\Match', 'visiting_team_id');
}
}
?>
Super bedankt Frank!

Alles werkt zoals het moet met de code zoals hierboven vermeld!

Reageren