October CMS下Quote、Status、Event模型关联关系设置方法咨询
October CMS 多模型(Quote/Status/Event)一对多关联配置方案
1. 前置数据库字段要求
先在quotes表中添加两个外键字段:
status_id:整数类型,关联statuses表的主键idevent_id:整数类型,关联events表的主键id
2. 各模型关联代码配置
以下代码中你的插件命名空间请替换为实际插件的命名空间,例如Acme\QuoteManager\Models。
2.1 Quote 模型(从属侧)
Quote 属于1个Status和1个Event,使用$belongsTo属性定义关联:
<?php namespace 你的插件命名空间\Models; use Model; class Quote extends Model { // 可填充字段可根据业务自行调整 public $fillable = ['title', 'content', 'status_id', 'event_id']; // 定义关联关系 public $belongsTo = [ 'status' => \你的插件命名空间\Models\Status::class, 'event' => \你的插件命名空间\Models\Event::class, ]; }
2.2 Status 模型(一对多的主侧)
Status可对应多个Quote,使用$hasMany属性定义关联:
<?php namespace 你的插件命名空间\Models; use Model; class Status extends Model { public $fillable = ['name']; // 存储状态名称,例如Active、Inactive、Draft // 关联多个Quote public $hasMany = [ 'quotes' => \你的插件命名空间\Models\Quote::class, ]; }
2.3 Event 模型(一对多的主侧)
Event可对应多个Quote,关联规则和Status一致:
<?php namespace 你的插件命名空间\Models; use Model; class Event extends Model { public $fillable = ['name', 'hold_date']; // 存储活动名称、举办日期等,例如Golf、Charity Dinner // 关联多个Quote public $hasMany = [ 'quotes' => \你的插件命名空间\Models\Quote::class, ]; }
3. 实际场景使用示例
对应需求:新建Quote时选择状态为「Active」、关联活动为「Golf」。
3.1 提前准备基础数据
先在对应表中创建基础配置项:
- Status表插入1条记录:
name = 'Active',主键id假设为1 - Event表插入1条记录:
name = 'Golf',主键id假设为2
3.2 代码层面创建关联Quote
// 获取要关联的状态和活动实例 $activeStatus = \你的插件命名空间\Models\Status::where('name', 'Active')->first(); $golfEvent = \你的插件命名空间\Models\Event::where('name', 'Golf')->first(); // 新建Quote并绑定关联 $newQuote = new \你的插件命名空间\Models\Quote(); $newQuote->title = '高尔夫活动报价单001'; $newQuote->content = '包含场地租赁、1名教练服务、20人茶歇,总价6800元'; // 两种关联赋值方式二选一即可 // 方式1:直接赋值外键 $newQuote->status_id = $activeStatus->id; $newQuote->event_id = $golfEvent->id; // 方式2:通过关联属性赋值 // $newQuote->status = $activeStatus; // $newQuote->event = $golfEvent; $newQuote->save();
3.3 后台表单可视化选择关联项
如果要在October CMS后台新建Quote时通过下拉框选择关联项,只需在Quote模型的fields.yaml配置文件中添加以下字段:
fields: title: label: 报价单名称 type: text content: label: 报价单内容 type: textarea status: label: 报价状态 type: relation nameFrom: name # 取Status表的name字段作为下拉选项显示内容 emptyOption: 请选择状态 event: label: 关联活动 type: relation nameFrom: name # 取Event表的name字段作为下拉选项显示内容 emptyOption: 请选择活动
配置完成后,后台新建Quote的表单会自动生成两个下拉选择框,可直接选择「Active」状态和「Golf」活动,保存后自动完成关联绑定。
4. 关联数据读取示例
// 读取单条Quote的关联状态和活动 $quote = Quote::find(1); echo $quote->status->name; // 输出:Active echo $quote->event->name; // 输出:Golf // 读取所有状态为Active的Quote $activeQuotes = Status::where('name', 'Active')->first()->quotes; // 读取所有关联Golf活动的Quote $golfQuotes = Event::where('name', 'Golf')->first()->quotes;
内容的提问来源于stack exchange,提问作者Jakef19
相关产品推荐
相关产品推荐

