Php Laravel雄辩的多对多模型
我正在拉威尔4号做一个项目,我已经停下来了 任务表: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
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
表中的第三条记录(id3
)在routines
表中有两条相关记录(第二条和第三条)因为这两条记录都包含emp\u id
字段中emp
表的第三条记录的id3
现在使用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
表。感谢所有帮助,非常感谢!