我有类似以下的数据库设计
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
民意调查可以有一个民意调查,而民意调查可以有很多民意调查。
这一切都很好,我可以创建民意调查,问答。这都是在后端完成的,后端需要您以管理员用户身份登录。
在前端,我需要显示民意调查问题和可能的答案。我建立了一个PollResponse模型,Poll可以有很多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对象,但它当前正在输出一个空的Poll对象。我怎样才能得到相关的民意调查 对象进入此功能,以便我可以将响应与特定的民意调查联系起来?
由于
答案 0 :(得分:1)
我打赌这是因为这句话:
Route::resource('/', 'PollResponseController', ['except' => ['create', 'show', 'edit', 'update', 'destroy']]);
资源方法的第一个参数expect需要资源名称(即“polls”或“polls.response”)。
我想知道您希望通过该调用实现什么,但如果您想将商店路线注册到“/ store”,您唯一的方法就是定义这样的常规路线:
Route::post('store/{polls}', 'PollResponseController@store');
这是因为laravel的restful资源总是必须有某种基本路径,你不能把它们放到域的根目录中(example.com/{id),example.com / {private / edit,example .com / store / {id}等。)
另一种方法是提供如下资源名称:
Route::resource('polls.response', 'PollResponseController', ['except' => ['create', 'show', 'edit', 'update', 'destroy']]);
但您必须相应地更改表单网址。
我也会检查这一行:
{!! Form::model(new App\PollResponse, ['route' => ['store', $poll->id]]) !!}
假设'polls.response'是注册资源您可能需要将'polls.response.store'作为路由名称传递。