2017-09-25 1 views
0

Je suis proche de finir mon CMS mais j'ai un problème mineur.Laravel | Enregistrer et afficher deux relations

Je peux créer plusieurs équipes, fonctionne parfaitement bien.

Je peux créer plusieurs jeux, fonctionne aussi parfaitement bien.

Maintenant, je veux créer des correspondances entre ces équipes, ce qui signifie que j'ai deux tableaux croisés dynamiques. L'un appelé game_match et l'autre appelé match_team.

game_match se composent de game_id et match_id

match_team se composent de match_id, team1_id et team2_id

Mon match/create.blade.php a deux champs de liste déroulante pour chaque équipe. Sauvegarder une seule relation à la base de données fonctionne bien pour moi, comme je l'ai fait à quelques reprises, mais je ne peux pas comprendre comment enregistrer deux relations.

C'est ce que je suis arrivé à ce jour:

intérieur match/create.blade.php

<div class="field m-t-20 is-inline-block"> 
    <p class="control"> 
     <label for="home" class="label"><b>{{ trans_choice('messages.home', 1) }}</b></label> 
     <input type="hidden" name="home" id="home" :value="homeSelected"> 
     <div class="select"> 
      <select v-model="homeSelected"> 
       @foreach($teams as $team) 
        <option value="{{ $team->id }}">{{ $team->name }}</option> 
       @endforeach 
      </select> 
     </div> 
    </p> 
</div> 

<div class="field m-t-20 is-inline-block"> 
    <p class="control"> 
     <label for="opponent" class="label"><b>{{ trans_choice('messages.opponent', 1) }}</b></label> 
     <input type="hidden" name="opponent" id="opponent" :value="opponentSelected"> 
     <div class="select"> 
      <select v-model="opponentSelected"> 
       @foreach($teams as $team) 
        <option value="{{ $team->id }}">{{ $team->name }}</option> 
       @endforeach 
      </select> 
     </div> 
    </p> 
</div> 

@section('scripts') 
    <script> 
     var app = new Vue({ 
      el: '#app', 
      data: { 
       homeSelected: "", 
       opponentSelected: "", 
       gameSelected: "" 
      } 
     }); 
    </script> 
@endsection 

MatchController.php

public function store(Request $request) 
    { 
     $this->validate($request, [ 
      'title' => 'required|max:255', 
      'matchday' => 'required', 
     ]); 

     $match = new Match(); 

     $match->title = $request->title; 
     $match->matchday = $request->matchday; 

     if ($match->save()) { 
      $match->games()->sync($request->game); 
      $match->teams()->sync([ 
       ['team1_id' => $request->home, 'team2_id' => $request->opponent], 
      ]); 

      Session::flash('success', trans('messages.created', ['item' => $match->title])); 
      return redirect()->route('matches.show', $match->id); 
     } else { 
      Session::flash('error', trans('messages.error')); 
      return redirect()->route('matches.create')->withInput(); 
     } 
    } 

match.php

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\SoftDeletes; 

class Match extends Model 
{ 
    use SoftDeletes; // <-- Use This Instead Of SoftDeletingTrait 

    protected $fillable = [ 
     'title' 
    ]; 

    protected $dates = ['deleted_at']; 

    public function setHomeTeam() {} 

    public function teams() { 
     return $this->belongsToMany('App\Team', 'match_team', 'match_id', 'team1_id'); 
    } 

    public function games() { 
     return $this->belongsToMany('App\Game', 'game_match'); 
    } 

    public function getHomeTeam() { 
     return $this->belongsToMany('App\Team', 'match_team', 'match_id', 'team1_id'); 
    } 

    public function getOpponentTeam() { 
     return $this->belongsToMany('App\Team', 'match_team', 'match_id', 'team2_id'); 
    } 
} 

Quelqu'un peut-il m'aider?

Répondre

0

Vous devriez utiliser les méthodes firstOrCreate(), updateOrCreate ou attach().

+0

Cela ne résout pas le problème auquel je suis confronté en sauvegardant deux relations de la même table étrangère. – Kazuto