Hyperf 模型关联(Model Relationships)完整实战指南:从一对一、多对多到多态关联与预加载
后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载导读本文是 Hyperf 框架模型层关联功能的系统性实战指南。你将学会在Hyperf\DbConnection\Model\Model中定义一对一hasOne、一对多hasMany、反向关联belongsTo、多对多belongsToMany以及多态关联morphOne / morphMany / morphTo等全部关联类型掌握中间表pivot的读写、自定义访问器与过滤、利用预加载Eager Loading根治 N1 查询问题并通过Relation::morphMap自定义多态映射、用whereHasMorph做多态关系查询。读完本文即可在 Hyperf 项目中按规范建模并写出高性能的关联查询代码。关联的定义方式方法即查询构造器在 Hyperf 中模型关联以模型类上的方法形式呈现源码见 src/database/src/Model/Concerns/HasRelationships.php 中hasOne、hasMany、belongsTo、belongsToMany、morphOne、morphMany、morphTo等定义。与模型本身一样关联对象同时也是功能强大的查询构造器query builder支持丰富的链式调用与查询能力。例如我们可以给role关联的链式调用附加约束条件$user-role()-where(level, 1)-get();这一特性意味着关联方法既可以当属性访问返回已加载的关联结果也可以当查询入口继续拼接where、orderBy、limit等约束两者互补覆盖从简单取值到复杂查询的全部场景。一对一关联One to One一对一是最基础的关联类型。例如一个User模型可以对应一个Role模型。定义方式是在User模型内编写role方法方法内部调用hasOne并返回其结果?php declare(strict_types1); namespace App\Models; use Hyperf\DbConnection\Model\Model; class User extends Model { public function role() { return $this-hasOne(Role::class, user_id, id); } }hasOne方法的第一个参数是关联模型的类名。第二、三个参数分别用于指定关联表的外键字段与当前模型的主键或本地键字段均可省略并依赖约定不传时外键默认取“当前模型名的蛇形snake_case形式 _id”本地键默认取当前模型主键。从源码 HasRelationships.php 可见hasOne内部通过newRelatedInstance实例化关联模型、以$foreignKey ?: $this-getForeignKey()推断外键、以$localKey ?: $this-getKeyName()推断本地键。关联定义完成后即可通过 Hyperf 的动态属性获取关联记录。动态属性允许你像访问模型上定义的属性一样访问关联方法$role User::query()-find(1)-role;动态属性背后的机制是模型访问未知属性时会尝试调用同名关联方法并缓存其结果见 src/database/src/Model/Concerns/HasAttributes.php 中getRelationValue的实现。这一机制对所有关联类型通用。一对多关联One to Many一对多关联用于定义“一个模型拥有任意数量的其他模型”。例如一位作者可以撰写多本书。与所有 Hyperf 关联一样一对多关系的定义同样是在模型中编写方法?php declare(strict_types1); namespace App\Models; use Hyperf\DbConnection\Model\Model; class User extends Model { public function books() { return $this-hasMany(Book::class, user_id, id); } }需要记住Hyperf 会自动确定Book模型的外键属性。按约定Hyperf 使用“所属模型名称的蛇形形式 _id后缀”作为外键字段。因此在上例中Hyperf 会假定Book模型上对应User的外键是user_id。若你的表结构不符合该约定请像上例一样显式传入第二、第三个参数。关联定义后通过访问User模型的books属性即可获得书籍集合。由于 Hyperf 提供“动态属性”你可以像访问模型属性一样访问关联方法$books User::query()-find(1)-books; foreach ($books as $book) { // }当然由于所有关联都可以作为查询构造器使用你也可以通过链式调用为books方法附加额外约束$book User::query()-find(1)-books()-where(title, Mastering the Hyperf framework in one month)-first();一对多关联的反向belongsTo既然我们可以获取某位作者的全部作品那么反过来也可以通过一本书找到它的作者。该关联是hasMany的逆向关联需在子模型中用belongsTo方法定义?php declare(strict_types1); namespace App\Models; use Hyperf\DbConnection\Model\Model; class Book extends Model { public function author() { return $this-belongsTo(User::class, user_id, id); } }从源码看belongsTo在未传外键时会用调用方法名的蛇形形式拼接_id推断外键HasRelationships.php。关联定义完成后我们即可通过Book模型的author动态属性获取对应的User模型$book Book::find(1); echo $book-author-name;多对多关联Many to Many多对多关联比hasOne和hasMany稍复杂。例如一个用户可以有多个角色而这些角色也可以被其他用户共享——多个用户可能同时拥有“管理员”这一角色。要定义该关联需要三张数据库表users、roles以及role_user。其中role_user表按两个关联模型的字母顺序命名并包含user_id与role_id字段。多对多关联通过在模型方法内部调用belongsToMany并返回其结果来定义。例如在User模型中定义roles方法?php namespace App; use Hyperf\DbConnection\Model\Model; class User extends Model { public function roles() { return $this-belongsToMany(Role::class); } }关联定义后即可通过roles动态属性获取用户角色$user User::query()-find(1); foreach ($user-roles as $role) { // }与其他关联模型一样你可以使用roles方法通过链式调用为查询附加约束$roles User::find(1)-roles()-orderBy(name)-get();中间表命名约定与自定义如前所述为确定关联中间表的表名Hyperf 会按字母顺序拼接两个关联模型的名字源码见joiningTable方法HasRelationships.php内部对模型类名取蛇形片段、sort排序后用下划线连接。当然你也可以跳过该约定向belongsToMany方法传入第二个参数return $this-belongsToMany(Role::class, role_user);除了自定义中间表名还可以通过向belongsToMany传入更多参数来定义表中的键名第三个参数是定义该关联的模型在中间表中的外键名第四个参数是另一个模型在中间表中的外键名return $this-belongsToMany(Role::class, role_user, user_id, role_id);获取中间表字段pivot 属性如你所知多对多关联依赖中间表支撑Hyperf 提供了一些实用的方法与这张表交互。例如假设User对象关联了多个Role对象在获取这些关联对象后可以通过模型的pivot属性访问中间表数据$user User::find(1); foreach ($user-roles as $role) { echo $role-pivot-created_at; }需要注意的是我们获取到的每一个Role模型对象都会被自动赋予一个pivot属性它代表中间表的一个模型对象可以像其他 Hyperf 模型一样使用。默认情况下pivot对象只包含两个关联模型的主键。如果中间表还有额外字段必须在定义关联时用withPivot显式指定return $this-belongsToMany(Role::class)-withPivot(column1, column2);如果希望中间表自动维护created_at与updated_at时间戳则在定义关联时追加withTimestamps方法return $this-belongsToMany(Role::class)-withTimestamps();从源码实现看withTimestamps会置位withTimestamps标志并调用withPivot($this-createdAt(), $this-updatedAt())将两个时间戳字段纳入 pivot 选择列见 src/database/src/Model/Relations/BelongsToMany.php同时get()、paginate()等结果获取流程都会调用hydratePivotRelation为每个关联模型挂载 pivot 实例并将额外的中间表字段填充到 pivot 对象中。自定义 pivot 属性名as如前所述中间表属性默认通过pivot访问但你可以自由地重命名该属性使其在业务中语义更清晰。例如如果你的应用包含订阅功能的用户用户与博客之间可能存在多对多关系。此时你或许希望把中间表访问器命名为subscription而不是pivot。这可以通过在定义关联时使用as方法实现return $this-belongsToMany(Podcast::class)-as(subscription)-withTimestamps();定义完成后即可用自定义名称访问中间表数据$users User::with(podcasts)-get(); foreach ($users-flatMap-podcasts as $podcast) { echo $podcast-subscription-created_at; }as方法在源码层面就是设置BelongsToMany的$accessor属性默认为pivot见 BelongsToMany.php最终体现在 pivot 关系的水合与buildDictionary匹配逻辑中。通过中间表过滤关联wherePivot / wherePivotIn在定义关联时还可以使用wherePivot与wherePivotIn方法过滤belongsToMany返回的结果return $this-belongsToMany(App\Role)-wherePivot(approved, 1); return $this-belongsToMany(App\Role)-wherePivotIn(priority, [1, 2]);这两个方法会将过滤条件作用到带表名前缀的中间表列上wherePivot生成where($this-table . . . $column, ...)wherePivotIn生成对应的whereIn见 BelongsToMany.php并同时把条件记录到pivotWheres/pivotWhereIns中确保新增中间表记录时也会应用同样的默认值语义。预加载Eager Loading与 N1 查询当把 Hyperf 关联作为属性访问时关联数据是“惰性加载lazy load”的——即首次访问属性时才真正加载关联数据。不过Hyperf 可以在查询父模型时“预加载preload”子关联。预加载可以缓解 N1 查询问题。为说明 N1 问题考虑一个与Role关联的User模型?php declare(strict_types1); namespace App\Models; use Hyperf\DbConnection\Model\Model; class User extends Model { public function role() { return $this-hasOne(Role::class, user_id, id); } }现在让我们获取所有用户及其对应的角色$users User::query()-get(); foreach ($users as $user){ echo $user-role-name; }这个循环会先执行一次查询获取全部用户然后再为每个用户执行一次查询获取角色。如果有 10 个用户这个循环将执行 11 次查询1 次查用户10 次额外查角色。幸运的是使用预加载可以将操作压缩到仅 2 次查询。在查询时可以使用with方法指定要预加载的关联$users User::query()-with(role)-get(); foreach ($users as $user){ echo $user-role-name; }在这个示例中只执行了两条查询SELECT * FROM user; SELECT * FROM role WHERE id in (1, 2, 3, ...);从实现上看预加载由模型查询构造器的eagerLoadRelations流程驱动各关联类型通过addEagerConstraints构造WHERE id IN (...)约束、initRelation为每个父模型初始化空关联容器与match将子结果按外键字典匹配回父模型三个步骤协作完成例如BelongsToMany的对应实现见 BelongsToMany.php。多态关联Polymorphic Association多态关联允许目标模型借助关联关系同时关联多个模型适合“一张表服务多种所有者”的场景。一对一多态One to OnePolymorphic表结构一对一多态关联与简单的一对一关联类似区别在于目标模型可以在同一条关联上属于多个模型。例如Book与User可能共享对Image模型的关联。使用一对一多态关联可以为Book和User复用同一张图片表。先看表结构book id - integer title - string user id - integer name - string image id - integer url - string imageable_id - integer imageable_type - stringimage表中的imageable_id字段会根据imageable_type的不同而含义不同。默认情况下imageable_type直接存储相关的模型类名。模型示例?php namespace App\Model; class Image extends Model { public function imageable() { return $this-morphTo(); } } class Book extends Model { public function image() { return $this-morphOne(Image::class, imageable); } } class User extends Model { public function image() { return $this-morphOne(Image::class, imageable); } }morphOne的第二个参数name会派生出一对多态字段{name}_id与{name}_type源码中通过getMorphs($name, $type, $id)解析HasRelationships.php。获取关联按上述方式定义模型后即可通过模型关联获取对应模型。例如获取一个用户的图片use App\Model\User; $user User::find(1); $image $user-image;或者获取用户或书籍对应的图片——imageable会根据imageable_type获取对应的User或Bookuse App\Model\Image; $image Image::find(1); $imageable $image-imageable;一对多多态One to ManyPolymorphic模型示例?php namespace App\Model; class Image extends Model { public function imageable() { return $this-morphTo(); } } class Book extends Model { public function images() { return $this-morphMany(Image::class, imageable); } } class User extends Model { public function images() { return $this-morphMany(Image::class, imageable); } }获取关联获取用户的所有图片use App\Model\User; $user User::query()-find(1); foreach ($user-images as $image) { // ... }自定义多态映射morphMap默认情况下框架要求type字段存储对应的模型类名。例如上面的imageable_type必须是User::class与Book::class。但在实际应用中直接存储完整类名既不美观也让数据库与应用程序内部结构强耦合、非常不便。因此我们可以自定义映射关系将数据库与应用的内部结构解耦use App\Model; use Hyperf\Database\Model\Relations\Relation; Relation::morphMap([ user Model\User::class, book Model\Book::class, ]);由于Relation::morphMap修改后会在内存中长期驻留因此我们可以让项目在启动时创建对应的关系映射。可以创建如下监听器?php declare(strict_types1); /** * This file is part of Hyperf. * * link https://www.hyperf.io * document https://doc.hyperf.io * contact grouphyperf.io * license https://github.com/hyperf/hyperf/blob/master/LICENSE */ namespace App\Listener; use App\Model; use Hyperf\Database\Model\Relations\Relation; use Hyperf\Event\Annotation\Listener; use Hyperf\Event\Contract\ListenerInterface; use Hyperf\Framework\Event\BootApplication; #[Listener] class MorphMapRelationListener implements ListenerInterface { public function listen(): array { return [ BootApplication::class, ]; } public function process(object $event) { Relation::morphMap([ user Model\User::class, book Model\Book::class, ]); } }该监听器监听Hyperf\Framework\Event\BootApplication事件在应用启动阶段注册映射。从源码看Relation::morphMap会维护静态的$morphMap数组模型读写多态字段时通过getActualClassNameForMorph/getMorphAlias在类名与别名之间转换src/database/src/Model/Relations/Relation.php同时Relation::requireMorphMap与enforceMorphMap还可以强制要求所有多态类型必须显式映射Relation.php从而杜绝意外将类名写入数据库。嵌套预加载 morphTo 关联morphWith如果你想加载morphTo关联同时加载该关联可能返回的各种实体的嵌套关联可以将with方法与morphTo关联的morphWith方法配合使用。例如我们计划预加载图片的book.user关联use App\Model\Book; use App\Model\Image; use Hyperf\Database\Model\Relations\MorphTo; $images Image::query()-with([ imageable function (MorphTo $morphTo) { $morphTo-morphWith([ Book::class [user], ]); }, ])-get();对应的 SQL 查询如下-- Search all pictures select * from images; -- Query the user list corresponding to the image select * from user where user.id in (1, 2); -- Query the list of books corresponding to the image select * from book where book.id in (1, 2, 3); -- Query the user list corresponding to the book list select * from user where user.id in (1, 2);实现层面morphWith会把“按多态类型分组”的嵌套预加载配置存入morphableEagerLoads在预加载时getResultsByType会按类型分别构建查询并将该类型的嵌套关联合并进 eager loads见 src/database/src/Model/Relations/MorphTo.php。多态关联查询whereHasMorph要查询“存在某个MorphTo关联”的记录可以使用whereHasMorph方法及其配套方法。下面这个示例会查询imageable_id为 1 的 book 或 user 对应的图片列表use App\Model\Book; use App\Model\Image; use App\Model\User; use Hyperf\Database\Model\Builder; $images Image::query()-whereHasMorph( imageable, [ User::class, Book::class, ], function (Builder $query) { $query-where(imageable_id, 1); } )-get();whereHasMorph的实现位于 src/database/src/Model/Concerns/QueriesRelationships.php它内部委托hasMorph针对多态类型列表逐一构建存在性约束实现“图片必须关联到 ID 为 1 的用户或书籍”这一过滤语义。小结Hyperf 的模型关联覆盖了数据库建模中的全部常见形态hasOne/hasMany表达拥有关系belongsTo表达归属关系belongsToMany借助中间表表达多对多morphOne/morphMany/morphTo通过{name}_id{name}_type双字段表达多态关系。搭配动态属性、with预加载、withPivot/withTimestamps/as/wherePivot等中间表控制手段以及Relation::morphMap与whereHasMorph多态能力即可在 Hyperf 项目中写出结构清晰、查询高效的数据访问层代码。相关完整实现可继续阅读仓库源码 src/database/src/Model/Relations/ 目录下的各关联类以及 src/database/src/Model/Concerns/HasRelationships.php 与 src/database/src/Model/Concerns/QueriesRelationships.php。赞分享后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载相关推荐SQLAlchemy 基础关系模式完全指南一对多、多对一、一对一、多对多与关联对象模式SQLAlchemy 基础关系模式完全指南一对多、多对一、一对一、多对多与关联对象模式 本篇指南围绕 SQLAlchemy 2.x 的 Declarative数据库后端ORMSeedVR28GB显存实现专业级视频增强的终极指南SeedVR28GB显存实现专业级视频增强的终极指南 还在为模糊视频和低分辨率影像而烦恼吗今天我要介绍一款革命性的AI工具——SeedVR2这是字节跳动S计算机视觉人工智能ThinkPHP模型关联终极指南轻松掌握一对一、一对多与多对多关系ThinkPHP模型关联终极指南轻松掌握一对一、一对多与多对多关系 ThinkPHP作为十年匠心的高性能PHP框架其强大的模型关联功能让数据库操作变得异常简后端Web框架上一篇JuiceFS 监控指标完全指南Prometheus 指标体系详解与源码级解读下一篇LifeOS 中的 D3.js 交互式仪表盘工作流从可视化选型到生产级实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI Agent Skills 设计指南:从 GKE 节点排查到 Genkit 工作流编排

AI Agent Skills 设计指南:从 GKE 节点排查到 Genkit 工作流编排

1. 从“skills”这个标题说起:它到底指什么第一次看到“skills”这个标题,很多人会以为是某个招聘网站上的技能标签,或者是一份简历里的能力清单。但结合热搜词里反复出现的 Agent Skills、Google Cloud、GKE、Genkit、codex skills、claude …

2026/10/7 9:57:39 阅读更多 →
如何在e2e测试中混合AI智能体与确定性断言?3步搞定完整指南

如何在e2e测试中混合AI智能体与确定性断言?3步搞定完整指南

如何在e2e测试中混合AI智能体与确定性断言?3步搞定完整指南 【免费下载链接】e2e Next generation e2e testing framework for web and mobile apps. 项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e e2e 是一个面向 Web 与移动端的下一代端到端测试…

2026/10/7 9:57:39 阅读更多 →
Pendulum 时区完全指南:DST 过渡、归一化与 fold 语义详解

Pendulum 时区完全指南:DST 过渡、归一化与 fold 语义详解

后端 【免费下载链接】pendulum Python datetimes made easy 项目地址: https://gitcode.com/gh_mirrors/pe/pendulum 点击查看 免费下载 导读 时区是任何 datetime 库都无法回避的复杂话题,尤其在夏令时(DST)切换的"弹簧前…

2026/10/7 9:56:39 阅读更多 →

最新新闻

Kettle Job变量驱动循环实现动态ETL流程控制

Kettle Job变量驱动循环实现动态ETL流程控制

简介:本资源是一份面向ETL开发工程师与Kettle(Pentaho Data Integration)进阶使用者的实战技术文档,聚焦解决“如何在Job中循环遍历结果集,并将每行数据动态传入下游转换处理”这一典型难点。内容完整呈现了jobj1.kjb作…

2026/10/7 11:03:52 阅读更多 →
RAG 知识库-元数据

RAG 知识库-元数据

知识库元数据:从"文档堆"到"可检索资产"的设计实践在 RAG 和 AI 知识库落地的过程中,很多人把精力放在 embedding 模型、向量库选型、chunk 策略上,却忽略了一个更底层的问题:你的知识库,真的&quo…

2026/10/7 11:03:52 阅读更多 →
MySQL InnoDB redo log深度解析:一条INSERT事务的完整生命周期

MySQL InnoDB redo log深度解析:一条INSERT事务的完整生命周期

一条INSERT语句,从客户端敲下回车,到事务提交成功,中间到底发生了什么?如果你只能回答“写缓冲、刷脏页”,那可能还不够。很多后端开发者能把索引结构、隔离级别背得滚瓜烂熟,但一遇到数据目录里的ib_logfi…

2026/10/7 11:03:52 阅读更多 →
Spring Boot整合MQTT通信:配置、代码与踩坑指南

Spring Boot整合MQTT通信:配置、代码与踩坑指南

直接上结论:在 Spring Boot 项目里做 MQTT 通信,最稳的方案是用spring-integration-mqtt,它可以无缝融入 Spring 的事件机制和依赖注入体系,比单独用 Paho 客户端再自己写线程管理要省心得多。这篇文章我尽量把从环境准备、代码实…

2026/10/7 11:03:52 阅读更多 →
从一条UPDATE事务看InnoDB redo log全生命周期

从一条UPDATE事务看InnoDB redo log全生命周期

聊 InnoDB 的 redo log,很多资料一上来就抛 buffer pool、LSN、崩溃恢复,一眼看去全是术语,初学者很容易绕晕。我自己也是在处理一个“update 偶尔特别慢”的问题时,把一条事务从开始到提交的每一步都翻出来看,才真正把…

2026/10/7 11:03:52 阅读更多 →
U-Boot移植必知:Kbuild构建系统原理与实战避坑指南

U-Boot移植必知:Kbuild构建系统原理与实战避坑指南

1. 从一份编译报错说起:为什么U-Boot移植绕不开Kbuild第一次给一块新板子做U-Boot移植的人,十有八九会在编译阶段卡住。现象往往很朴素:make xxx_defconfig跑完看着挺正常,接着make一敲,报错信息里冒出一堆No rule to …

2026/10/7 11:02:51 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →