我是laravel的新手,我已经知道如何使用查询生成器联接表。我只是想学习如何使用关系来避免重复代码并简化代码。我可以加入2张桌子,但无法获得3张桌子。
我喜欢显示Tasks
表中分配给员工的任务信息,该表仅具有需要加入Projects
表中的项目ID。其他员工可以与其他员工一起加入现有项目。
Employee
模型:
public function tasks()
{
return $this->hasMany('\App\Task', 'project_coder', 'id');
}
Task
模型:
public function projects()
{
return $this->hasMany('\App\Project', 'id', 'project_id');
}
Projects
模型:
public function belongsToTasks()
{
return $this->belongsToMany('\App\Task', 'project_id', 'id');
}
我只能从Task模型中获取IDS。该ID将用于从项目表中获取项目信息。不幸的是,我不能做到这一点。
员工控制者:
public function show($id)
{
$data = Employees::find($id);
return view('show-employee')->withInfo($data);
}
使用查询生成器而不是使用关系是一种好习惯吗?
更新:
Employees
表
{
"id":1,
"name": "Juan"
}
Tasks
表
{
"id":1, // autoincrement and will not be use for linking to other tables.
"project_id": 1, //use to connect to project table
"project_coder": 1 // use to connect to employees table
}
Projects
表
{
"id":1,
"name": "First Project"
}
答案 0 :(得分:2)
为此,最好创建像employee_task
这样的数据透视表
其中表只有两列task_id
和employee_id
然后您可以在任务模型中定义
public function employees()
{
return $this->belongsToMany('\App\Employee', 'employee_task');
}
和员工模型
public function tasks()
{
return $this->belongsToMany('\App\Task', 'employee_task');
}
现在您可以看到所有员工任务,其余的人际关系也很好
$data = Employees::find($id);
$data->tasks //you get all tasks assigned to this employee
$data->tasks()->first()->projects //you get all your projects for first task
$data->tasks()->first()->employees //all employees assigned to first task with this employee
还建议您查找数据透视表,attach()
,detach()
和sync()
函数。您可以在这里查看:https://laravel.com/docs/5.7/eloquent-relationships#updating-many-to-many-relationships
更新:
好的,我现在了解您正在尝试做什么。您已经有数据透视表。我对不必要的您的Project模型有点困惑。
如果仅具有此关系,则可以删除您的Project
类
并按照我上面的描述更新您的模型关系。在这种关系中,您不需要project_id
和project_coder_id
。还要将列名更改为更常规的名称,例如我提到的employee_id
和task_id
或任何表名。
您可以将employee_task
数据透视表名称重命名为项目表,也可以重命名。
编辑
将Project模型用于其他数据时,您需要如上所述创建第4个表。
最终
project_coder
表中删除Tasks
列-不必要的列employees_task
,employee_id
task_id
我假设Project
hasMany()
个任务和Task
个仅belongsTo()
个项目。因此,还需要创建这些关系。
然后您可以使用以下关系:
$employee = Employee::find($id);
$task = Task::find($id);
$project = Project::find($id);
$employee->tasks //all tasks assigned to employee
$task->employees //all employees assigned to task
$task->project //project info assigned to task
$employee->tasks()->first()->project //project data from first task of employee
$project->tasks()->first()->employees //all employees assigned to first project task