在Vapor中,我们可以通过创建Pivot<U, T>对象来创建多对多关系,其中U和T是我们想要链接在一起的模型.因此,如果我想创建一个系统,其中Users可以有多个Files而且许多Files可以属于许多Users,我会将它们关联起来:
var alice = User(name: "Alice")
try! alice.save()
var sales = File(name: "sales.xclx")
try! sales.save()
var pivot = Pivot<User, File>(alice, sales)
try! pivot.save()
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我的生活是如何制作一个Pivot<User, File>包含额外信息的?例如,我想知道这个文件何时与Alice关联,或者对它有什么权限.
在Relational数据库上,Fluent为该Pivot<User, File>类型创建此表.
+---------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| file_id | int(11) | NO | | NULL | |
| user_id | int(11) | NO | | NULL | |
+---------+---------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
但我希望有能力代表这样的事情:
+---------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| file_id | int(11) | NO | | NULL | |
| user_id | int(11) | NO | | NULL | |
| date | date | NO | | NULL | |
| perms | varchar | NO | | READ | |
+---------+---------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
该Pivot<U, T>对象可以被认为是枢转关系的"最小"必需字段siblings.
如果要向此表添加自定义字段,只要具有所需元素,就可以创建自己的类作为数据透视表:
Foo和Bar是bar_foo(小写的,按字母顺序排列)id,bar_id,foo_id换句话说,由pivot类创建的表必须至少具有Pivot<Foo, Bar>准备创建的元素.
完成此操作后,您可以通过创建和保存数据透视表类的实例来创建新的数据透视关系.
在.siblings()使用此数据透视表的模型上调用关系时,Pivot<U, T>仍将创建默认值以执行提取.但是,由于数据透视表上存在必填字段,因此不会产生任何问题.
| 归档时间: |
|
| 查看次数: |
768 次 |
| 最近记录: |