Laravel项目与任务之间的关系

时间:2016-05-11 13:12:28

标签: laravel

我有两个模型,Project和Tasks。我已将它们定义如下:

class Project extends Model
{
    protected $fillable = ['name'];

    public function tasks() {
        return $this->hasMany(Task::class);
    }

}

class Task extends Model
{
    protected $fillable = ['name', 'description', 'completed'];

    public function project() {
        return $this->belongsTo(Project::class);
    }
}

我想打印项目列表(1)和每个项目我要列出任务(2),并且我想要显示每个任务的详细信息单个任务(3)。< / p>

要实现(1)和(2)我已经设置了一个projectsController(仅显示相关部分):

class ProjectsController extends Controller
{

    public function index() {
        $projects = Project::all();
        return view('projects.index', compact('projects'));
    }

    public function show(Project $project) {
        return view('projects.show', compact('project'));
    }    
}

和路由文件:

Route::get('projects', array('as' => 'project-index', 'uses' => 'ProjectsController@index'));
Route::get('project/{project}', array('as' => 'project-show', 'uses' => 'ProjectsController@show'));

在(1)的视图文件中,我循环使用 @foreach($ projects as $ project)和(2),我循环使用 @ foreach($ project-&gt; tasks as $ task)。一切正常。

然而,对于(3),为了显示我单击的单个任务,我定义了一个TasksController:

class TasksController extends Controller
{
    public function show(Project $project, Task $task) {
        return view('tasks.show', compact('task'));
    }

}

和路线:

Route::get('project/{project}/task/{task}', array('as' => 'project-tasks-show', 'uses' => 'TasksController@show'));

我有找到如何最好地完成的问题(3)。在视图文件中,当我在Taskscontroller中传递'task'集合时,我可以访问任务详细信息。

我认为这样做效率不高也不明智:

  • 在TasksController中,当我只传递Task时出错 $ task,所以我还必须添加Project $项目。
  • 由于我在控制器的show函数中有$ project集合,有没有办法可以将项目集合(而不是任务)传递给视图,然后只选择那个任务,这样我就可以使用了...... $ project-&gt;视图中的任务,同时也可以访问例如$ project-&gt;名称。
  • 处理此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

尝试这个,如果在任务模型中有project_id的外键

  class TasksController extends Controller
  {
     public function show($project, $task) {
        $task = Task::where('project_id', $project)->find($task);
        return view('tasks.show', compact('task'));
     }
  }

和路线:

Route::get('project/{project}/task/{task}', array('as' => 'project-tasks-show', 'uses' => 'TasksController@show'));    

并回复它。