模型关系和传递对象

时间:2016-03-21 13:15:47

标签: laravel laravel-5 laravel-5.1

我有类似以下的数据库设计

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对象。我怎样才能得到相关的民意调查 对象进入此功能,以便我可以将响应与特定的民意调查联系起来?

由于

1 个答案:

答案 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'作为路由名称传递。