【发布时间】:2020-06-17 20:52:31
【问题描述】:
我是 Laravel 和 Eloquent 的新手。 在我的应用程序中,我想检索当前用户和其他项目成员的任务并在视图中显示它们。 这是我建立的数据库关系:
users (id)
projects(id, user_id)
user_project(id、user_id、project_id、角色)
tasks (id, user_id, project_id)
(我已经在迁移中定义了所需的外键)
为了解释这种关系,每个项目都有一个用户(创建项目的人)。但是在user_project 表中,用户也可以分配到其他项目,并且在那里定义他们的角色。例如:有两个用户:
id=1
id=2
还有三个项目:
id=1,user_id=1
id=2,user_id=2
id=3,user_id=1
user_project 关系:
id=1,user_id=1,project_id=1,角色=admin
id=2,user_id=2,project_id=1,角色=employee
id=3,user_id=2,project_id=2,角色=admin
id=4,user_id=1,project_id=3,角色=admin
还有四个任务:
id=1,user_id=1,project_id=1
id=2,user_id=2,project_id=1
id=3,user_id=1,project_id=2
id=4,user_id=1,project_id=3
我希望用户 id=2 能够看到 project_id=1 的任务,因为他作为员工被邀请到该项目以及 project_id=2 的任务,因为他创建了该项目。当然,用户应该看不到 project_id=3 的任务,因为他不是会员。那么,最简洁的方法是什么?
这是我定义的模型:
class User extends Authenticatable
{
public function projects(){
return $this->hasMany(Project::class);
}
public function tasks(){
return $this->hasMany(Task::class);
}
public function joinedProjects()
{
return $this->hasMany(ProjectUser::class);
}
}
class Project extends Model
{
public function tasks(){
return $this->hasMany(Task::class);
}
public function users(){
return $this->hasMany(User::class);
}
}
class ProjectUser extends Model
{
}
class Task extends Model
{
public function projects(){
return $this->belongsTo(Project::class);
}
public function users(){
return $this->belongsTo(User::class);
}
}
这是我尝试检索项目成员任务的方式(我正在寻找的理想方式是:$tasks = $user->joinedProjects->tasks 但我不知道该怎么做,所以这就是我的方式我目前正在尝试完成这项工作):
class TasksController extends Controller
{
public function index()
{
$user = Auth()->user();
//I guess there are better ways to retrieve projects, but:
$projects = app('App\Http\Controllers\HomeController')->allProjects($user);
foreach($projects as $project){
$tasks[] = Task::where('project_id', $project->id);
}
return view('tasks.index', compact(['tasks','user']));
//gives error: Property [id] does not exist on the Eloquent builder instance
//when I'm trying to get $task->id in a foreach loop.
}
}
这是 home 控制器(我需要 HomeController 中的 allProjects() 函数来实现其他一些类函数):
class HomeController extends Controller
{
function allProjects($user){
$projects = $user->projects;
$otherProjects = \App\ProjectUser::where('user_id',$user->id)->get();
foreach ($otherProjects as $project){
$projects[] = \App\Project::find($project->project_id);
}
return $projects;
}
}
【问题讨论】:
-
为什么不只用
$user->projects( )->get( )访问它? -
当我使用它时,它只提供用户创建的项目。将错过邀请用户参与的其他项目。
标签: laravel eloquent many-to-many