Php Laravel雄辩的多对多模型

Php Laravel雄辩的多对多模型,php,mysql,sql,laravel,eloquent,Php,Mysql,Sql,Laravel,Eloquent,我正在拉威尔4号做一个项目,我已经停下来了 任务表: task_id (PK) task_title 测量表: measure_id (PK) measure_title 例程表: routine_id (PK) date time value emp_id (FK) 环境管理计划表: emp_id (PK) first_name last_name user_name email user_type 现在我感到困惑的是,我将如何用雄辩的语言来模拟这些关系,因为我似乎无法理解。在phpm

我正在拉威尔4号做一个项目,我已经停下来了

任务表:

task_id (PK)
task_title
测量表:

measure_id (PK)
measure_title
例程表:

routine_id (PK)
date
time
value
emp_id (FK)
环境管理计划表:

emp_id (PK)
first_name
last_name
user_name
email
user_type
现在我感到困惑的是,我将如何用雄辩的语言来模拟这些关系,因为我似乎无法理解。在
phpmyadmin
DB中,我目前有两个表将任务和测量连接到具有
task\u例程的例程:
task\u id(PK)
routine\u id(PK)
measure\u例程
measure\u id(PK)
routine\u id(PK)


希望这句话和我写这封信时在脑海中听到的一样清晰,谢谢你的帮助

首先,在所有表中,将
PK
字段从
*\u id
更改为
id
。如果要为一个表与另一个表建立关系,则约定是,应使用父表的
名称\u id
(名称应为单数形式)在子表中保留外键,例如,要在
emp
routines
表之间建立关系,您应该在
routines
表中使用
emp\u id
外键,并且
emps
表应该包含
id
PK
。因此,您的
emps
表是父表,
routines
emps
的子表,在这两个表中记录应该是这样的(可以使用自定义约定):

EMP
(父项):

例程
(子项):

这里,
emp
表的每个
id
emp\u id
字段的
routines
表中用作外键。因此,
emps
表在
routines
表中有三条相关记录,
emps
表中的第一条记录与
routines
表中的第一条记录相关,
emps
表中的第三条记录(id
3
)在
routines
表中有两条相关记录(第二条和第三条)因为这两条记录都包含
emp\u id
字段中
emp
表的第三条记录的id
3

现在使用Laravel建立关系: 如果父表在子表中只有一个相关表,则使用
一对一
,例如,如果id为
1的记录(第一条记录)在
emps
表中,使用
emp_id
字段,值为
1
routines
表中只有一条相关记录,如果它不能位于
routines
表中的多条记录中,则它是
一对一
关系,并且在上述示例中,记录不是
一对一
关系,因为在
例程
表中有两条记录具有
emps
表中相同的
id/pk
,因此它转到
一对多
关系,因此可以将其读取为
emps
记录中有许多
例程
。要建立一对多关系,我们可以使用:

class Emp extends Eloquent {
    public function routines()
    {
        return $this->hasMany('Routine');
    }
}
class Emp extends Eloquent {
    public function routines()
    {
        return $this->belongsToMany('Routine');
    }
}
例程
模型:

class Routine extends Eloquent {
    public function emp()
    {
        return $this->belongsTo('Emp');
    }
}
class Routine extends Eloquent {
    public function emp()
    {
        return $this->belongsToMany('Emp');
    }
}
一对多
关系中,父表可能包含具有相同
id的多个子记录
,但如果子表中的记录也有多个父记录,则它应该是
多对多
关系。例如,如果我们想在例程表中构建这样的关系(不可能两次使用同一主键):

在这种情况下,这是一种
多对多
关系,不可能在一个表中使用相同的
id/PK
两次,因此我们需要使用第三个表(称为
pivot
表)在
emp
表和
例程
表之间建立
多对多
关系维护多对多
关系。因此,它将类似于下表:

表名应该是
emp_例程
,但还有其他方法可以使用 名称不同,但遵循此约定

emp_例程
Pivot表: 在这里,父级和子级在这两个表中都有多个相关记录,并且此
pivot
表维护该关系

要使用Laravel建立关系,我们可以使用:

class Emp extends Eloquent {
    public function routines()
    {
        return $this->hasMany('Routine');
    }
}
class Emp extends Eloquent {
    public function routines()
    {
        return $this->belongsToMany('Routine');
    }
}
例程
模型:

class Routine extends Eloquent {
    public function emp()
    {
        return $this->belongsTo('Emp');
    }
}
class Routine extends Eloquent {
    public function emp()
    {
        return $this->belongsToMany('Emp');
    }
}
在这种情况下,我们在
例程
表中不需要外键字段(emp_id),因为我们使用透视表来维护关系,但如果它存在,就不会有问题


应该注意的是,每当您在父表中插入/更新任何记录时,您也必须在pivot表中插入/更新关系数据,而Laravel为这些提供了有用的方法。因此。

您的问题到底是什么?您想如何在哪些表之间建立关系?是的-您是在寻找设置这些表的方法,还是寻找将任务直接连接到度量值的方法?查看本教程。。。嘿,谢谢你的长篇大论,这对我理解它的工作原理有很大帮助。如果您的示例中的emp表与两个表有多对多关系,这将如何工作?只需为所有三个表扩展Eloquent并在两个表上向emp运行belongTomany函数,然后向两个表运行emp?是的,对于
many-to-many
关系,使用每个模型的
belongTomany
,并使用
pivot
表。感谢所有帮助,非常感谢!