Laravel 5.4 3个表之间的关系

时间:2019-01-03 08:28:11

标签: php laravel

我是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"
}

1 个答案:

答案 0 :(得分:2)

为此,最好创建像employee_task这样的数据透视表 其中表只有两列task_idemployee_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_idproject_coder_id。还要将列名更改为更常规的名称,例如我提到的employee_idtask_id或任何表名。 您可以将employee_task数据透视表名称重命名为项目表,也可以重命名。

编辑

将Project模型用于其他数据时,您需要如上所述创建第4个表。

最终

  • project_coder表中删除Tasks列-不必要的列
  • 使用employees_taskemployee_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