Laravel投票系统

时间:2014-11-11 15:42:10

标签: php mysql laravel

我正在我的laravel学校项目中实施投票系统,它将是一个在线学校平台,学生可以上传项目,其他学生可以对已发布的内容进行投票。

不知怎的,我所做的并不工作......到目前为止,这是我的代码,希望有人可以帮助我,也许可以帮助我如何显示项目的投票数。

这是我的数据库迁移:

Schema::create('votes', function($table){
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->integer('project_id')->unsigned();
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users');
    $table->foreign('project_id')->references('id')->on('projects');
});

我的模特:

Class Vote extends Eloquent{

public function user(){
    return $this->belongsTo('User');
}
public function project(){
    return $this->belongsTo('Project');
}

}

我的观点:

@foreach ($projects as $project)
    <li class="medium-4 columns">
        <div class="canvas-medium">
            <img src="{{ $project->image }}">
        </div>
        <p class="title">{{ $project->name }}</p>
        <p class="owner">By 
            <a href="profile/{{ $project->user_id }}">{{ $project->user->firstname }} {{ $project->user->name }}</a>
            <a href="/vote/{{ $project->id }}">Vote</a>
        </p>
    </li>
@endforeach

我的控制器:

class VoteController extends BaseController{

    public function vote($id){
        $vote = new Vote;
        $vote->user_id = Auth::id();
        $vote->project_id = $id;
        $vote->Save();

        return Redirect::to('/projects');
    }

}

routes.php文件:

Route::get('/projects', 'ProjectController@showall');
Route::get('/projects/vote/{id}', 'VoteController@vote');

2 个答案:

答案 0 :(得分:4)

更改

<a href="/vote/{{ $project->id }}">Vote</a>

<a href="/projects/vote/{{ $project->id }}">Vote</a>

P.S。如果您没有进行验证,并且如果您没有在具有项目ID和用户ID的数据库中设置唯一索引,则学生可以为一个特定项目多次投票....您可能你不会想要的吗?

编辑(使用流畅的查询构建器)

Route::get('/projects', 'ProjectController@showall');将显示所有项目。

如果您想获得每个项目的详细信息,则必须执行以下操作:

  • 设置路线。例如Route::get('/projects/{id}', 'ProjectController@showone')
  • 然后在控制器/ repo / model中检索结果 return DB::table('vote')->where('project_id','=',$id)->get();

如果你想显示每个项目的每个投票数,那么它会有点复杂但是就是这样。

return DB::table('project AS p')->select([DB::raw('@project:=p.id'), 
       DB::raw('(SELECT COUNT(id) FROM votes AS v WHERE v.project_id = @project) AS votes'),
       ])->paginate(30); //or get()

答案 1 :(得分:0)

我会避免按路线添加链接,而是通过控制器链接它:

<a href="{{ URL::action('VoteController@vote', [$project->id]) }}">Vote</a>

查看网页时,网址会显示为“http://example.com/projects/vote/1”。此外,如果您按如下方式更改路线:

  • OLD /projects/vote/{id}
  • /projects/{id}/vote

您的链接将自动更改为使用到该控制器的新路线。