ARTICLE DETAIL

资讯详情

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

NeoEloquent 一对一关系教程:hasOne 与 belongsTo 的完整用法

NeoEloquent 一对一关系教程:hasOne 与 belongsTo 的完整用法 NeoEloquent 一对一关系教程hasOne 与 belongsTo 的完整用法【免费下载链接】NeoEloquentThe Neo4j OGM for Laravel项目地址: https://gitcode.com/gh_mirrors/ne/NeoEloquent在 Neo4j 图数据库中模型之间的一对一关系是建模的基础能力而 NeoEloquentLaravel 的 Neo4j OGM通过hasOne与belongsTo两个方法让你用熟悉的 Eloquent 语法轻松管理这种关系。本文将从零开始带你掌握一对一关系的定义、保存、查询、预加载与删除的完整用法无论你是刚接触 Neo4j 的新手还是想快速上手的 Laravel 开发者都能在 10 分钟内学会。核心概念图数据库中关系是有方向的实体。hasOne表示从当前节点指向关联节点的出站关系OUTGOINGbelongsTo则是它的入站反向INCOMING。一、什么是一对一关系一对一关系指一个节点最多关联另一个节点例如一个用户拥有一个资料档案User-HAS-Profile一部手机属于一个用户Phone-BELONGS-User一个位置属于一个用户Location-LOCATED_AT-User在 Neo4j 中这表现为两个节点之间的一条有向边。hasOne与belongsTo恰好是这条边的两个方向因此在模型中总是成对出现。二、模型定义hasOne 与 belongsTo 的写法2.1 hasOne声明出站关系在父模型中定义hasOne第一个参数是关联模型类名第二个参数是关系类型名相当于关系表名use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent; class User extends NeoEloquent { protected $fillable [name, email]; public function profile() { return $this-hasOne(App\Models\Profile, PROFILE); } }源码位置HasOne.php 与 Model.php 中的hasOne()方法。2.2 belongsTo声明入站反向关系在关联模型中定义belongsTo方向恰好相反use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent; class Profile extends NeoEloquent { protected $fillable [guid, service]; public function user() { return $this-belongsTo(App\Models\User, PROFILE); } }源码位置BelongsTo.php 中的addConstraints()方法。⚠️注意hasOne与belongsTo中的关系类型名必须一致如都是PROFILE才能指向同一条边。三、创建与保存一对一关系3.1 使用 save() 创建新节点并关联这是最常用的方式先创建父模型再通过save()一次性创建关联节点和关系边。$user User::create([name 张三, email zhangexample.com]); $profile new Profile([guid uuid-123, service twitter]); $relation $user-profile()-save($profile);save()返回一个EdgeOut对象出站边底层执行的 Cypher 等价于MATCH (user:User) WHERE id(user) 1 CREATE (user)-[:PROFILE]-(profile:Profile {guid: uuid-123, service: twitter}) RETURN profile;3.2 使用 associate() 关联已存在的节点如果两个节点都已存在用belongsTo侧的associate()建立联系。注意associate()不会自动持久化必须手动调用save()$user User::find(1986); $location Location::find(1922); $relation $location-user()-associate($user); // 返回 EdgeIn $relation-save(); // 关键必须保存✅ 由于 Neo4j 中关系本身是实体associate()返回的EdgeIn对象还可以设置关系属性例如$relation-since 1966; $relation-save();。相关实现见 OneRelation.php。四、查询一对一关系4.1 动态加载最简单的方式像访问普通属性一样读取关联模型NeoEloquent 会自动帮你执行查询$profile User::find(1)-profile; // hasOne 侧 $user Profile::find(1)-user; // belongsTo 侧 // 直接取关联模型的属性 $name $user-profile-service;4.2 预加载Eager Loading避免 N1 查询当需要批量查询时用with()预加载只需 2 条 Cypher 查询即可完成全部关联数据的获取$users User::with(profile)-get(); foreach ($users as $user) { echo $user-profile-service; }预加载的内部实现可参考 HasOne.php 的addEagerConstraints()方法与 BelongsTo.php 的同名方法。4.3 通过 edge() 获取关系边本身如果你想直接操作这条关系读取或修改关系上的属性可以用edge()方法$relation $user-profile()-edge(); // 自动推断关联模型 $relation $user-profile()-edge($profile); // 指定另一端的模型 $relation-active true; $relation-save();五、删除一对一关系删除关系边用delete()可选参数true表示保留两端节点$relation $user-profile()-edge(); $relation-delete(); // 删除关系保留 User 和 Profile 节点 $relation-delete(true); // 删除关系并保留两端节点六、一对一关系的常见避坑指南易错点说明关系类型不一致hasOne与belongsTo的第二参数必须相同忘记保存 associateassociate()后必须调用$relation-save()方向搞反hasOne是出站-belongsTo是入站-看 Cypher 中的箭头方向即可确认覆盖旧关系一对一关系同一时刻只有一个再次save()新模型会替换旧关联可参考测试 HasOneRelationTest.php 中的testSavingMultipleRelationsKeepsOnlyTheLastOne七、完整示例用户与资料档案完整可运行的模型定义与测试用例可以在仓库中找到电影示例模型Examples/Movies/models/Movie.php、Examples/Movies/models/Actor.phphasOne 功能测试tests/functional/HasOneRelationTest.phpbelongsTo 功能测试tests/functional/BelongsToRelationTest.php如果需要本地运行先克隆仓库git clone https://gitcode.com/gh_mirrors/ne/NeoEloquent然后参考 Examples/Movies/README.md 的步骤执行初始化 Cypher 并运行php start.php即可体验完整流程。结语通过本文你已经掌握了 NeoEloquent 一对一关系的完整用法hasOne定义出站方向、belongsTo定义入站方向配合save()、associate()、动态加载与预加载可以轻松驾驭 Neo4j 图数据建模。下一步建议继续学习hasMany/belongsToMany一对多与多对多关系让图数据库的威力充分发挥出来。【免费下载链接】NeoEloquentThe Neo4j OGM for Laravel项目地址: https://gitcode.com/gh_mirrors/ne/NeoEloquent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表