我正在laravel 4中做一个项目,现在我停下来了。任务表:task_id (PK)task_title尺寸表:measure_id (PK)measure_title例程表:routine_id (PK)datetimevalueemp_id (FK)emps表:emp_id (PK)first_namelast_nameuser_nameemailuser_type现在,我困惑的是如何雄辩地建模这些关系,因为我似乎无法弄清楚。在phpmyadmin数据库中,我目前有两个表,这些表将任务和测量值连接到具有task_routine的例程:task_id (PK),routine_id (PK)和measure_routine:measure_id (PK),routine_id(PK)。希望我写的时候像我脑海中一样清晰,并感谢您的帮助! 最佳答案 首先,在所有表中,将PK字段从*_id更改为id。如果要使一个表与另一个表建立关系,则约定是,应使用父表的name_id(名称应为单数形式)在子表中保留外键,例如,在emps和routines表之间的关系上,应在emp_id表中使用routines外键,并且emps表应包含id PK。因此,您的emps表是父表,而routines是emps的子表,并且在两个表中的记录都应像这样(可以使用自定义约定):表emps(父级):id (pk) | first_name | more fields ... 1 | Mr | ... 2 | Miss | ... 3 | Mrs | ...表routines(子级):id (pk) | emp_id (FK) | more fields ... 1 | 1 | ... - Child of emps table's first record 2 | 3 | ... - Child of emps table's third record 3 | 3 | ... - Child of emps table's third record在这里,id表的每个emps用作routines字段中emp_id表中的外键。因此,emps表在routines表中具有三个相关记录,并且emps表中的第一条记录与routines表中的第一条记录以及emps表中的第三条记录(id为3 )在routines表中有两个相关记录(第二和第三),因为两个记录都在3字段中包含emps表的第三条记录的id emp_id。现在使用Laravel建立关系:如果您的父表在子表中只有一个相关表,则使用one-to-one,例如,如果1表中ID为emps(第一条记录)的记录在routines表中只有一个相关记录,则使用值为emp_id的字段,如果它不能出现在1表中的多个记录中,则它是routines关系,并且在上面给出的示例记录中不是one-to-one关系,因为在表中有两个记录,这些记录具有与one-to-one表相同的routines可用,因此它变为id/pk关系,因此可以将其读取为记录中的emps有许多one-to-many。要建立emps关系,我们可以使用:class Emp extends Eloquent { public function routines() { return $this->hasMany('Routine'); }}routines模型:class Routine extends Eloquent { public function emp() { return $this->belongsTo('Emp'); }}在one-to-many关系中,父表可能包含多个具有相同Routine的子记录,但是如果子表中的记录也有许多父表,则它应该是one-to-many关系。例如,如果我们要在例程表中建立这样的关系(不能两次使用相同的主键):id (pk) | emp_id (FK) | more fields ... 1 | 1 | ... 2 | 2 | ... - Record 2(id) has parent 2(emp_id) 2 | 3 | ... - Record 2(id) has also parent 3(emp_id)在这种情况下,这是一个id关系,并且不可能在一个表中使用两次相同的many-to-many,因此我们需要使用第三个表(已知的)在many-to-many表和id/PK表之间建立many-to-many关系。如emps表)以保持routines关系。因此,它将类似于下表:表名称应为pivot,但还有其他使用方式名称不同,但遵循此约定。many-to-many数据透视表:id (pk) | emp_id (id/PK of emps) | routine_id (id/PK of routines) | more fields ... 1 | 1 | 1 | ... 2 | 2 | 1 | ... 3 | 1 | 2 | ...在这里,父表和子表在两个表中都具有多个相关记录,并且此emp_routine表维护该关系。要使用emp_routine建立关系,我们可以使用:class Emp extends Eloquent { public function routines() { return $this->belongsToMany('Routine'); }}pivot模型:class Routine extends Eloquent { public function emp() { return $this->belongsToMany('Emp'); }}在这种情况下,我们不需要Laravel表中的外键字段(emp_id),因为我们正在使用数据透视表来维护关系,但是如果存在,则不会有问题。应该注意的是,每当您在父表中插入/更新任何记录时,您也必须在数据透视表中插入/更新关系数据,Laravel为这些提供了有用的方法,因此check the manual (relationship)。关于php - Laravel Eloquent 多对多模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22457015/
10-09 06:09