ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NeoEloquent Edge 属性操作技巧:给关系添加时间戳与自定义字段

NeoEloquent Edge 属性操作技巧:给关系添加时间戳与自定义字段 NeoEloquent Edge 属性操作技巧给关系添加时间戳与自定义字段【免费下载链接】NeoEloquentThe Neo4j OGM for Laravel项目地址: https://gitcode.com/gh_mirrors/ne/NeoEloquentNeoEloquent 是 Laravel 生态中最流行的 Neo4j 图数据库 ORM官方定位为 The Neo4j OGM for Laravel。在 Neo4j 中关系Relationship本身就是一种实体可以携带属于自己的属性而 NeoEloquent 通过Edge机制把这一能力优雅地封装给了开发者。本文带你掌握 NeoEloquent Edge 属性操作的核心技巧如何给关系自动添加时间戳、如何写入自定义字段以及如何读取这些关系属性。无论你是刚接触图数据库的新手还是想深入玩转关系属性的进阶用户这篇 NeoEloquent Edge 教程都能帮你快速上手。为什么要关注 Edge关系属性有什么用在传统 SQL 里关系只是外键无法携带关系自己的数据。但在图数据库中关系可以描述什么时候、以什么身份、多少次发生连接。举个例子用户与角色之间是belongsToMany关系我们想知道用户从哪一年开始担任这个角色位置与用户之间是belongsTo关系我们想知道用户最近一次出现在这个位置的时间这些关系身上的数据在 NeoEloquent 里就是Edge 属性Edge Attributes。NeoEloquent 将 Edge 设计成一种轻量模型你可以像操作 Eloquent 模型一样去读写它。相关源码位于 src/Eloquent/Edges/Edge.php方向类分别为 EdgeIn.php入向关系和 EdgeOut.php出向关系。开启 Edge 自动时间戳的 3 个前提条件 ✅NeoEloquent Edge 默认就会尝试维护created_at和updated_at两个时间戳但有一个关键前提父模型必须开启时间戳功能。在 Edge.php 中定义了常量CREATED_AT与UPDATED_AT并在初始化关系initRelation()和保存save()时调用updateTimestamps()自动写入。只需在父模型中声明时间戳即可class User extends NeoEloquent { public $timestamps true; // 开启时间戳 }前提条件说明父模型$timestamps true这是 Edge 自动维护时间戳的总开关关系创建时自动写入created_at与updated_at关系更新时仅更新updated_at不覆盖created_at快速验证时间戳是否生效 ✅你可以用一段非常简单的代码验证关联模型后直接读取时间戳它会是Carbon\Carbon实例见 tests/functional/BelongsToRelationTest.php 中的测试写法$relation $location-user()-associate($user); // created_at 和 updated_at 都是 Carbon 实例 $created $relation-created_at; // 2026-08-18 08:40:11 $updated $relation-updated_at; // 2026-08-18 08:40:11给关系添加自定义字段的 3 种高效方法 Edge 最强大的地方在于你可以为一段关系存储任意自定义属性。以下是三种最常用的 NeoEloquent Edge 属性写入方式。方法一保存关系时直接传入属性数组在hasOne、hasMany等关系的save()方法中第二个参数就是关系属性实现见 src/Eloquent/Relations/HasOneOrMany.php$post new Post([title 你好图数据库]); // 保存文章同时给关系写入自定义字段 $edge $user-posts()-save($post, [is_pinned true, read_time 5]);方法二属性赋值后手动保存Edge 支持魔术属性赋值非常接近 Eloquent 的体验README 官方示例同样如此$relation $location-user()-associate($user); $relation-since 1966; // 自定义字段从哪年开始 $relation-present true; // 自定义字段是否在任 $relation-save();方法三使用 fill() 批量填充当自定义字段较多时用fill()一次性写入更高效Edge 的fill()方法定义在 Edge.php$relation $location-user()-associate($user); $relation-fill([ since 1966, present true, level senior, ]); $relation-save();如何读取已存在关系的 Edge 属性 关系保存后你可以通过edge()方法把关系重新取出来再像读模型属性一样读取它$location Location::find(1892); // 不带参数根据关系方法名自动推断另一端的模型 $edge $location-user()-edge(); // 带参数明确指定另一端的模型 $edge $location-user()-edge($location-user); // 读取自定义字段 echo $edge-since; // 1966 // 获取全部属性 $all $edge-toArray(); // 或 $edge-getAttributes()读取时间戳时NeoEloquent 会把存储的日期自动转换回Carbon实例asDateTime()负责转换所以你可以直接调用 Carbon 的全部日期方法$edge-created_at-format(Y-m-d H:i:s); $edge-updated_at-diffForHumans(); // 3 分钟前进阶技巧自定义日期字段也走 Carbon 转换 Edge 不仅内置了created_at/updated_at两个日期字段还允许你在 Edge 上声明额外的日期字段。Edge 的getDates()方法Edge.php会把自定义的$dates数组与默认时间戳合并凡是声明过的字段写入时自动格式化为存储格式、读取时自动转回 Carbonclass MembershipEdge extends EdgeOut { protected $dates [expires_at]; }之后你就能像使用内置时间戳一样使用expires_at了无需手动做任何日期格式转换。常见踩坑提醒 ⚠️场景需要留意的地方时间戳不生效检查父模型是否设置了$timestamps true关系被覆盖一对一唯一关系重新关联时旧关系会被自动删除见 Edge.php 中save()的唯一性处理读取值为空请先确认edge()传入了正确的模型或关系确实已保存自定义日期不转换记得把字段加入 Edge 的$dates数组总结让每一条关系都会说话 NeoEloquent 的 Edge 机制是它区别于普通 ORM 的最大亮点之一关系不只是连接更是可携带业务数据的实体。通过本文介绍的技巧你可以用$timestamps true让关系自动获得created_at/updated_at用save($model, $attributes)、属性赋值或fill()三种方式写入自定义字段用edge()方法取回关系并读取属性时间戳自动转 Carbon通过$dates数组让任意字段享受日期自动转换想让你的 Neo4j 数据模型更丰满不妨从今天起给每条 Edge 加上属于它自己的时间戳与字段吧【免费下载链接】NeoEloquentThe Neo4j OGM for Laravel项目地址: https://gitcode.com/gh_mirrors/ne/NeoEloquent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表