2016-03-21 22 views
0

aşağıdakiModeli ilişkileri ve geçen Nesneler

Poll       

id | name 
-------------- 
1 | Poll One 

PollQuestion 

id | poll_id | question 
------------------------- 
1 | 1  | Something 

PollAnswer 

id | question_id | answer 
------------------------------- 
1 | 1   | Answer 1 
------------------------------- 
2 | 1   | Answer 2 
------------------------------- 
3 | 1   | Answer 3 

Bir Anket gibi bir veritabanı tasarımı Bir PollQuestion olabilir var ve bir PollQuestion birçok PollAnswer 's olabilir.

Her şey yolunda gidiyor, Anketler, sorular ve cevaplar oluşturabilirim. Bu, yönetici kullanıcı olarak giriş yapmanızı gerektiren bir arka planda yapılır.

Ön uçta Anket Sorusunu ve olası yanıtları görüntülemem gerekiyor. Anketin birçok PollResponse'ye sahip olabileceği bir PollResponse Modeli kurdum. Modeller

Route::group(['middleware' => ['web']], function() { 

    Route::model('polls.response', 'PollResponse'); 
    Route::resource('/', 'PollResponseController', ['except' => ['create', 'show', 'edit', 'update', 'destroy']]); 

    Route::group(['middleware' => ['admin_logged', 'can_see']], function() 
    { 
     Route::model('polls', 'Poll'); 
     Route::bind('polls', function($value, $route) { 
      return App\Poll::whereId($value)->first(); 
     }); 
     Route::resource('admin/polls', 'PollController'); 

     Route::model('polls.questions', 'PollQuestion'); 
     Route::resource('polls.questions', 'PollQuestionController', ['except' => ['index', 'create', 'show', 'edit', 'destroy']]); 
    }); 
}); 

Yani fikir aşağıdaki o zaman benim yolları böyle kurdunuz bu

class Poll extends Model 
{ 
    public function pollQuestion() 
    { 
     return $this->hasOne('App\PollQuestion', 'poll_id'); 
    } 

    public function pollResponse() 
    { 
     return $this->hasMany('App\PollResponse', 'poll_id'); 
    } 
} 

class PollResponse extends Model 
{ 
    public function poll() 
    { 
     return $this->belongsTo('App\Poll'); 
    } 
} 

şuna benzer ana alan adını ziyaret ve en son anket sorusunu görebileceğiniz normal bir kullanıcı onun olası cevaplar. Daha sonra cevabını seçip yanıtlarını gönderirler. Bunun görünümü aşağıdaki gibidir:

<div class="panel-heading"> 
    <h3 class="panel-title"> {{ $question->question }}</h3> 
</div> 
<div class="panel-body"> 
    {!! Form::model(new App\PollResponse, ['route' => ['store', $poll->id]]) !!} 
     @if (count($answers) !== 0) 
      @foreach($answers as $key => $value) 
       <div class="radio"> 
        <label> 
         <input type="radio" name="optionsRadios" value="{{ $value->answer }}"> {{ $value->answer }} 
        </label> 
       </div> 
      @endforeach 
     @endif 
     {!! Form::submit('Save', array("class"=>"btn btn-info pull-right ")) !!} 
    {!! Form::close() !!} 
</div> 

Tüm bunlar iyi çalışıyor. PollResponseController içinde mağaza işleviyle ilgili bir sorun yaşıyorum. Yanıtı gönderirseniz, poll_id, rotada tanımlandığı gibi URL'ye eklenir. Ama mağaza işlevinde, Şu anda ben çıkış akımı Anket Nesne bu beklenir

public function store(Request $request, Poll $poll) 
{ 
    dd($poll); 
} 

yapıyorum, ancak şu anda boş Anket Nesnesi çıktısı. İlgili Poll Nesnesini bu işleve nasıl alabilirim, böylece belirli bir Ankete yanıtları ilişkilendirebilir miyim?

Teşekkür

cevap

1

Ben çünkü bu hattın bahse:

Route::resource('/', 'PollResponseController', ['except' => ['create', 'show', 'edit', 'update', 'destroy']]); 

İlk parametre kaynak yönteminin beklediğini kaynak adını (yani "sandık" veya "polls.response") bekliyor.

Bunu çağrı ile elde etmek istediği merak, ancak "/ store" Bir mağaza rotayı kaydetmek istiyorsanız tek yolu bu gibi normal bir rota tanımlamaktır:

Route::post('store/{polls}', '[email protected]'); 

olduğunu çünkü, laravel'in dinlendirici kaynakları her zaman bir çeşit temel yola sahip olmak zorundadır, onları alanınızın köküne koyamazsınız (example.com/{id}, example.com/{id}/edit, example.com/store/ vb {id})

alternatif böyle kaynak adı sağlamaktır:

Route::resource('polls.response', 'PollResponseController', ['except' => ['create', 'show', 'edit', 'update', 'destroy']]); 

Ancak form URL'lerinizi buna göre değiştirmeniz gerekecektir.

{!! Form::model(new App\PollResponse, ['route' => ['store', $poll->id]]) !!} 

'polls.response' Bir rota adı olarak 'polls.response.store' geçmesi gerekebilir kaynakları kayıtlı olduğunu varsayarsak:

Ben de bu çizgiyi kontrol ederim.