2016-03-21 2 views
0

У меня есть проект базы данных, как в следующеммодель отношений и передачи объектов

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 

A Опрос может иметь один PollQuestion и PollQuestion может иметь много PollAnswer х.

Все это прекрасно работает, я могу создавать Опросы, вопросы и ответы. Все это делается в бэкэнд, который требует входа в систему как пользователь admin.

На внешнем интерфейсе мне нужно отобразить вопрос опроса и возможные ответы. Я создал модель PollResponse, к которой в опросе может быть много PollResponse. Модели выглядеть примерно так

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

Я тогда мои маршруты созданы, как это следующая

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

Таким образом, идея есть, обычный пользователь может посетить главный домен и увидеть последний опрос вопрос с его возможные ответы. Затем они выбирают ответ и отправляют ответ. Вид на это выглядит следующим образом:

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

Так что все это прекрасно работает. У меня проблема с функцией магазина, хотя в моем PollResponseController. Если я отправлю ответ, poll_id добавляется к URL-адресу, определенному в маршруте. Но в функции магазина, я сейчас делаю

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

Я бы ожидать, что это выходной ток опроса объекта, но в настоящее время выводит пустой Poll объект. Как я могу получить связанный опрос Объект в эту функцию, чтобы я мог связать ответы с конкретным опросом?

Благодаря

ответ

1

Я держал пари, что из-за этой линии:

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

Первый параметр ожидает метода ресурса ожидает имя ресурса (например, «опросы» или «polls.response»).

Интересно, что вы хотели бы достичь с этим вызовом, но если вы хотите зарегистрировать магазин маршрут к «/ магазин» Ваш единственный способ определить регулярный маршрут, как это:

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

То есть потому что ресурсы для сохранения laravel всегда должны иметь какой-то базовый путь, вы не можете поместить их в корень вашего домена (example.com/{id}, example.com/{id}/edit, example.com/store/ {ID}, и т.д.)

альтернатива заключается в предоставлении имя ресурса, как это:

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

Но вам нужно будет изменить свои URL-адреса.

Я бы также проверить эту строку:

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

Если предположить, что «polls.response» зарегистрирован ресурсы Вы, возможно, потребуется пройти «polls.response.store» в качестве имени маршрута.

Смежные вопросы