【问题标题】:Laravel voting systemLaravel 投票系统
【发布时间】:2015-01-08 05:22:54
【问题描述】:

我正在我的 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');

【问题讨论】:

  • “不知怎的,我所做的事情不起作用......” 好的,究竟是什么不起作用?你有任何错误吗?让我们得到一些细节!
  • 当我点击投票链接时,它会将我带到 /vote/1 for ex。并显示错误“Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException”

标签: php mysql laravel


【解决方案1】:

改变

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

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

附言如果您没有适当的验证,并且您没有在数据库中设置具有项目 ID 和用户 ID 的 唯一索引,则学生可以为一个特定项目多次投票....您可能也许你不想要?

编辑(使用流畅的查询生成器)

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

如果您想获取每个项目的详细信息,您必须这样做:

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

【讨论】:

  • 感谢它的工作!是的,但我最初是想完成这项工作。我希望用户只能投票一次。你也知道我如何显示一个项目的所有投票吗?
  • 我不使用雄辩。所以不知道它会在那里。在查询生成器中很简单。 return DB::tables('votes')-&gt;where('project_id','=',$id)-&gt;count();
  • 如何从视图中获取$id?
【解决方案2】:

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

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

例如,在查看页面时,URL 将显示为“http://example.com/projects/vote/1”。另外,如果你改变你的路线如下:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多