在文章与标签之间创建多对多的关系,需要用到一个中间表 .. 这种表有个专门的名字叫 pivot table .. 比如对于我们要创建的标签跟文章之间的关系,添加一个 pivot table ,名字可以是 post_tag ..这个表上面,每条数据记录要包含文章的 id 号,还有所属的标签的 id 号 ..
pivot
下面可以用一个 migration 去创建这个数据表 ... 在命令行的下面,创建一个 migration ... 名字是 post_tag ..
再创建一个 seeder ... adonis make:seed .. 名字是 PostTagPivot ..
回到项目 ... 先找到创建的 migration ... 在 up 方法里面 .. 要创建的表的名字是 post_tag ...
里面用一下 table 的 integer ... 添加一个 post_id ... unsigned ... 它是正数 .. 再用 table.foreign ... 把 post_id 变成一个外键 ... references 关联的是 posts 表上的 id 字段的值 ..
同样方法再添加一个 tag_id 字段 ... foreign 是 tag_id . 关联的是 tags 里面的 id 字段的值 ..
去掉这个 timestamps ..
再找到 down 方法,回滚的时候要删除的表是 post_tag ..
seeder
下面可以再去设置一下对应的 Seeder 文件 ... 找到这个 PostTagPivotSeeder ... 这里我们可以使用 Database 上的方法插入点数据到这个 post_tag 数据表里 ..
先添加一个 Database ... 用一下 Database ..
在 run 方法里, await .. Database ... table 是 post_tag ... 再 insert 插入一组数据 ... 设置一下要插入的每个数据项目 .. 每个项目都需要一个 post_id ,值是文章的 id 号 ... 还需要一个 tag_id ... 它的值是对应的标签记录的 id 号 ...
下面我们可以分别给数据库里的文章打上一些标签 ...
注意这个 post_id 是 1 的这个文章,有两条记录 .. 一个 tag_id 是 2 ,一个 tag_id 是 1 ... 因为一个文章内容可以同时打上多个标签 ...
另外 post_id 是 6 的这个文章也有两个标签 ...
回到命令行 ... 先运行一下 migration ... adonis migration:run
完成以后再 seed 一下数据 ... adonis seed --files PostTagPivotSeeder.js
这里遇到了一个问题 .. 提示 cannot add or update a child row ... a foreign key constraint fails ..
引起这个错误的原因是设置数据记录外键的时候出现了问题 .. 比如可能这个外键的 id 值在相关的数据表上不存在 ..
回到数据库客户端 ... 我们可以检查一下 ..
看一下 posts 这个表 ..
你会发现这个表的 id 号是从 6 开始的 .. 不是从 1 开始的 .. 有可能这个表里之前有一些被删除的记录 ..
刷新一下显示 .. 应用的数据库里会有 post_tag 这个表 .. 现在这个表里还没有数据 ..
再回到项目 .. 我们可以修改一下这个 seeder 要插入到 post_tag 表里的数据 ..
修改一下 post_id 的值 ... 文章列表数据的 id 应该是从 6 开始 .. 修改一下这些记录上的 post_id 的值 ...
回到命令行 ... 再 seed 一下 PostTagPivotSeeder .. 成功以后 .. 回到数据库客户端 ..
再浏览一下 post_tag 表里的数据 ... 现在里面会有几条数据记录 ...