2016-03-21 8 views
0

Ich habe eine Datenbank-Design wie das folgendeModell Beziehungen und vorbei Objekte

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 

Eine Umfrage One PollQuestion haben kann, und ein PollQuestion können viele PollAnswer des haben.

Das alles funktioniert gut, ich kann Umfragen, Fragen und Antworten erstellen. Dies geschieht in einem Backend, in dem Sie sich als Administrator anmelden müssen.

Am Frontend muss ich die Umfrage Frage und mögliche Antworten anzeigen. Ich habe ein PollResponse-Modell eingerichtet, auf das eine Umfrage viele PollResponse-Antworten haben kann. Models in etwa so aussehen

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'); 
    } 
} 

Ich habe dann meine Routen wie folgt aufgebaut folgende

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']]); 
    }); 
}); 

Die Idee ist, ein normaler Benutzer die Haupt-Domain besuchen und die neueste Umfrage Frage sehen mit ihren mögliche Antworten. Sie wählen dann eine Antwort und senden ihre Antwort. Der Blick dafür ist, wie die folgenden

<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> 

Also das alles funktioniert gut. Ich habe ein Problem mit der Speicherfunktion in meinem PollResponseController. Wenn ich die Antwort einsende, wird poll_id der URL hinzugefügt, die in der Route definiert ist. Aber in der Speicherfunktion, ich derzeit tue

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

Ich würde dies erwarten, dass das aktuelle Umfrage Objekt zur Ausgabe, aber es ist noch ein leeres Poll-Objekt ausgibt. Wie kann ich das zugehörige Poll Objekt in diese Funktion bekommen, damit ich die Antworten auf eine bestimmte Umfrage beziehen kann?

Dank

Antwort

1

Ich wette, es wegen dieser Linie ist:

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

Der erste Parameter erwartet der Ressource Methode erwartet den Namen der Ressource (das heißt „Umfragen“ oder „polls.response“).

Ich frage mich, was Sie mit diesem Anruf erreichen wollten, aber wenn man ein Geschäft Route „/ store“ Ihre einzige Möglichkeit ist, registrieren will eine regelmäßige Route wie folgt zu definieren:

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

Das heißt Da die resourcen Ressourcen von laravel immer einen Basispfad haben müssen, können Sie sie nicht in den Stamm Ihrer Domain einfügen (example.com/{id}, example.com/{id}/edit, example.com/store/ {id}, etc.)

Die Alternative ist, Ressourcennamen wie diese zu bieten:

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

Aber Sie müssen Ihre Formular-URLs entsprechend ändern.

Ich würde auch diese Zeile überprüfen:

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

Unter der Annahme, dass ‚polls.response‘ registriert Ressourcen Sie müssen möglicherweise ‚polls.response.store‘ als Routennamen zu übergeben.

Verwandte Themen