2016-10-25 1 views
1

J'ai besoin d'aide.Laravel - Many to Many - Reliure de modèle

J'ai ces tables: utilisateurs, achats et codecs. J'ai plusieurs à-plusieurs: buys, codecs, buy_codec

Tables

Schema::create('codecs', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->timestamps(); 
}); 

Schema::create('buys', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('user_id')->unsigned(); 
    $table->string('name'); 
}); 

Schema::create('buy_codec', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('buy_id')->unsigned(); 
    $table->foreign('buy_id')->references('id')->on('buys')->onDelete('cascade'); 

    $table->integer('codec_id')->unsigned(); 
    $table->foreign('codec_id')->references('id')->on('codecs')->onDelete('cascade'); 

    $table->timestamps(); 
}); 

Ceci est mon contrôleur:

class UserBuyController extends Controller 
{ 
    public function create($userId) 
    { 
     $codecs = Codec::lists('name', 'id'); 
     $usr = User::findOrFail($userId); 
     return view('buy.create', compact('usr', 'codecs')); 
    } 

    public function store($userId, Request $request) 
    { 
     $codecs = $request->input('codecs'); 
     $usr = User::findOrFail($userId)->buy()->create($request->except('codecs')); 
     $usr->codec()->sync($codecs); 
     return redirect('user/'.$userId.'/buy'); 
    } 

    public function edit($userId, $id) 
    { 
     $codecs = Codec::lists('name', 'id'); 
     $buy = User::findOrFail($userId)->buy()->findOrFail($id); 
     return view('buy.edit', compact('buy', 'codecs')); 
    } 
} 

Créer un formulaire

{!! Form::open(['method'=>'POST', 'action'=>['[email protected]', $usr->id]]) !!} 

    <div class="form-group"> 
     {!! Form::label('name', 'Name:') !!} 
     <div class="input-group"> 
      <span class="input-group-addon"><i class="fa fa-font"></i></span> 
      {!! Form::text('name', null, ['class'=>'form-control']) !!} 
     </div> 
    </div> 

    <div class="form-group"> 
     {!! Form::label('codecs', 'Outbound Codecs:') !!} 
     <div class="input-group"> 
      <span class="input-group-addon"><i class="fa fa-language"></i></span> 
      {!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!} 
     </div> 
    </div> 

    {!! Form::submit('Submit', ['class'=>'btn btn-info']) !!} 

{!! Form::close() !!} 

Et thi s est la forme modifier

{!! Form::model($buy,['url'=>url('user/'.$buy->user->id.'/buy/'.$buy->id),'method'=>'patch']) !!} 

    <div class="form-group"> 
     {!! Form::label('name', 'Name:') !!} 
     <div class="input-group"> 
      <span class="input-group-addon"><i class="fa fa-font"></i></span> 
      {!! Form::text('name', null, ['class'=>'form-control']) !!} 
     </div> 
    </div> 

    <div class="form-group"> 
     {!! Form::label('codecs', 'Outbound Codecs:') !!} 
     <div class="input-group"> 
      <span class="input-group-addon"><i class="fa fa-language"></i></span> 
      {!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!} 
     </div> 
    </div> 

    {!! Form::submit('Update', ['class'=>'btn btn-info']) !!} 

{!! Form::close() !!} 

modèle de liaison ne fonctionne pas

Quelque chose ne va, mais je ne sais pas quoi.

Ceci est mon tableau croisé dynamique. J'ai 2 codecs associés à buy_id 3

enter image description here

Et voici ma page d'édition.

enter image description here

Rien n'est sélectionné.


Mise à jour

Modèle

class Buy extends Model 
{ 
    protected $guarded = ['id']; 
    public function codec() { 
     return $this->belongsToMany('App\Codec'); 
    } 
    public function user() { 
     return $this->belongsTo('App\User'); 
    } 
} 

class Codec extends Model 
{ 
    protected $guarded = ['id']; 
    public function buy() { 
     return $this->belongsToMany('App\Buy'); 
    } 
} 
class User extends Authenticatable 
{ 
    public function buy() { 
     return $this->hasMany('App\Buy'); 
    } 
} 
+0

Pouvez-vous publier vos relations de modèle? –

+0

Bonjour, @JanWillem. Post mis à jour. Merci. – confm

+0

Qu'est-ce qui ne fonctionne pas, à savoir qu'est-ce que vous attendez de ce qui ne se passe pas? –

Répondre

1

Une solution serait de créer un accesseur pour le codec ids et l'utiliser avec Form::select() à la place:

Dans votre Buy modèle ajouter l'accesseur suivant:

public function getCodecListAttribute() 
{ 
    return $this->codecs->pluck('id')->toArray(); 
} 

changer Ensuite, vous sélectionnez bloc:

<div class="form-group"> 
    {!! Form::label('codec_list', 'Outbound Codecs:') !!} 
    <div class="input-group"> 
     <span class="input-group-addon"><i class="fa fa-language"></i></span> 
     {!! Form::select('codec_list[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!} 
    </div> 
</div> 

Cela signifie que lorsque vous essayez d'obtenir la valeur de la demande, vous devrez utiliser codec_list au lieu de codecs.

Espérons que cela aide!

+0

Merci @ RossWilson, Maintenant ça marche. Je peux aussi l'utiliser sans accesseur, dans le formulaire d'édition, comme ceci: {!! Form :: select ('codecs', $ codecs, $ buy-> codec> listes ('id') -> toArray(), ['class' => 'form-control', 'multiple' => 'multiple ']) !!}. – confm

+0

@confirm N'oubliez pas que 'lists' est obsolète depuis Laravel 5.2. 'plumer' est le préféré. –

+0

Oh, merci encore! – confm

1

dans le formulaire d'édition: {!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!} la valeur sélectionnée par défaut est null. Vous devriez définir ici la liste des identifiants des codecs associés.

Espérons que cela aide.

+0

Au lieu de null, je peux utiliser $ buy-> codec-> listes ('id') -> toArray() et ça marche. Je vous remercie! – confm