### [](https://octobercms.com/docs/database/relations#inserting-related-models)插入相关模型
就像您[查询关系一样](https://octobercms.com/docs/database/relations#querying-relations),October支持使用方法或动态属性方法定义关系。例如,也许您需要`Comment`为`Post`模型插入一个新的。您可以直接从关系中插入,而不必在上手动设置`post_id`属性。`Comment``Comment`
### [](https://octobercms.com/docs/database/relations#inserting-method)通过关系方法插入
October提供了将新模型添加到关系的便捷方法。主要可以将模型添加到关系中或从关系中删除。在每种情况下,关系分别是关联的或分离的。
#### 添加方式
使用该`add`方法来关联新关系。
~~~
$comment = new Comment(['message' => 'A new comment.']);
$post = Post::find(1);
$comment = $post->comments()->add($comment);
~~~
注意,我们没有将`comments`关系作为动态属性来访问。相反,我们调用该`comments`方法来获取关系的实例。该`add`方法将自动`post_id`为新`Comment`模型添加适当的值。
如果需要保存多个相关模型,则可以使用以下`addMany`方法:
~~~
$post = Post::find(1);
$post->comments()->addMany([
new Comment(['message' => 'A new comment.']),
new Comment(['message' => 'Another comment.']),
]);
~~~
#### 删除方法
相比之下,该`remove`方法可用于取消关联,使其成为孤立记录。
~~~
$post->comments()->remove($comment);
~~~
对于多对多关系,该记录将从关系的集合中删除。
~~~
$post->categories()->remove($category);
~~~
如果是“属于”关系,则可以使用该`dissociate`方法,该方法不需要将相关模型传递给它。
~~~
$post->author()->dissociate();
~~~
#### 添加枢轴数据
当使用多对多关系时,该`add`方法将附加的中间“枢轴”表属性数组作为其第二个参数接受为数组。
~~~
$user = User::find(1);
$pivotData = ['expires' => $expires];
$user->roles()->add($role, $pivotData);
~~~
该`add`方法的第二个参数还可以指定当作为字符串传递时,[延迟绑定](https://octobercms.com/docs/database/relations#deferred-binding)使用的会话密钥。在这些情况下,可以将数据透视表作为第三个参数提供。
~~~
$user->roles()->add($role, $sessionKey, $pivotData);
~~~
#### 创建方法
虽然`add`并`addMany`接受一个完整的模型实例,你也可以使用该`create`方法,接受属性的PHP数组,创建了一个模型,并将其插入到数据库中。
~~~
$post = Post::find(1);
$comment = $post->comments()->create([
'message' => 'A new comment.',
]);
~~~
在使用该`create`方法之前,请确保查看有关属性[质量分配](https://octobercms.com/docs/database/model#mass-assignment)的文档,因为PHP数组中的属性受模型的“可填充”定义限制。
### [](https://octobercms.com/docs/database/relations#inserting-dynamic-property)通过动态属性插入
关系可以通过访问它们的方式直接通过它们的属性来设置。使用这种方法设置关系将覆盖以前存在的任何关系。之后应像保存任何属性一样保存模型。
~~~
$post->author = $author;
$post->comments = [$comment1, $comment2];
$post->save();
~~~
或者,您可以使用主键设置关系,这在使用HTML表单时非常有用。
~~~
// Assign to author with ID of 3
$post->author = 3;
// Assign comments with IDs of 1, 2 and 3
$post->comments = [1, 2, 3];
$post->save();
~~~
通过将NULL值分配给属性,可以解除关联。
~~~
$post->author = null;
$post->comments = null;
$post->save();
~~~
与[延迟绑定](https://octobercms.com/docs/database/relations#deferred-binding)类似,在不存在的模型上定义的关系会在内存中延迟,直到它们被保存为止。在此示例中,帖子尚不存在,因此`post_id`无法通过设置评论的属性`$post->comments`。因此,将关联推迟到通过调用`save`方法创建帖子之前。
~~~
$comment = Comment::find(1);
$post = new Post;
$post->comments = [$comment];
$post->save();
~~~
### [](https://octobercms.com/docs/database/relations#inserting-many-to-many-relations)多对多关系
#### 装卸
在使用多对多关系时,模型提供了一些其他的辅助方法,使使用相关模型更加方便。例如,让我们假设一个用户可以有许多角色,而一个角色可以有许多用户。要通过在连接模型的中间表中插入一条记录来将角色附加给用户,请使用以下`attach`方法:
~~~
$user = User::find(1);
$user->roles()->attach($roleId);
~~~
将关系附加到模型时,您还可以传递要插入到中间表中的其他数据数组:
~~~
$user->roles()->attach($roleId, ['expires' => $expires]);
~~~
当然,有时可能有必要从用户中删除角色。若要删除多对多关系记录,请使用`detach`方法。该`detach`方法将从中间表中删除适当的记录;但是,两个模型都将保留在数据库中:
~~~
// Detach a single role from the user...
$user->roles()->detach($roleId);
// Detach all roles from the user...
$user->roles()->detach();
~~~
为了方便起见,`attach`并且`detach`还接受ID作为输入的数组:
~~~
$user = User::find(1);
$user->roles()->detach([1, 2, 3]);
$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);
~~~
#### 同步方便
您也可以使用该`sync`方法构造多对多关联。该`sync`方法接受ID数组以放置在中间表上。给定数组中没有的任何ID将从中间表中删除。因此,完成此操作后,中间表中将仅存在数组中的ID:
~~~
$user->roles()->sync([1, 2, 3]);
~~~
您还可以传递带有ID的其他中间表值:
~~~
$user->roles()->sync([1 => ['expires' => true], 2, 3]);
~~~
### [](https://octobercms.com/docs/database/relations#touching-parent-timestamps)感动的父母时间戳
当一个模型`belongsTo`或`belongsToMany`另一个模型(例如`Comment`属于a)时`Post`,在更新子模型时更新父时间戳有时会很有帮助。例如,当`Comment`模型更新时,您可能想要自动“触摸”`updated_at`所有者的时间戳`Post`。只需`touches`向子模型添加一个包含关系名称的属性:
~~~
class Comment extends Model
{
/**
* All of the relationships to be touched.
*/
protected $touches = ['post'];
/**
* Relations
*/
public $belongsTo = [
'post' => ['Acme\Blog\Models\Post']
];
}
~~~
现在,当您更新时`Comment`,所有者`Post`将同时`updated_at`更新其列:
~~~
$comment = Comment::find(1);
$comment->text = 'Edit to this comment!';
$comment->save();
~~~
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图