【问题标题】:October CMS relation to self十月 CMS 与自我的关系
【发布时间】:2018-10-24 04:25:30
【问题描述】:

我有 Event 模型并希望能够选择其中的其他事件以显示在前端。

我尝试的第一件事是关系,但问题是我不知道如何使用数据透视表,因为实际上它应该包含两个字段并且都应该命名为“event_id”,这显然是不可能的。 也许有人可以建议任何方法来避免这种情况或更好的方法来解决我在事件模型中的事件选择字段的问题?

提前致谢。

【问题讨论】:

    标签: octobercms


    【解决方案1】:

    是的same name for relation_id 可能是不可能的,但我们有选择:)

    你可以像这样创建中间表

    <?php namespace HardikSatasiya\SoTest\Updates;
    
    use Schema;
    use October\Rain\Database\Updates\Migration;
    
    class BuilderTableCreateHardiksatasiyaSotestEventsEvents extends Migration
    {
        public function up()
        {
            Schema::create('hardiksatasiya_sotest_events_events', function($table)
            {
                $table->engine = 'InnoDB';
                $table->increments('id')->unsigned();
                $table->integer('events_id')->unsigned();
                $table->integer('related_events_id')->unsigned();
            });
        }
    
        public function down()
        {
            Schema::dropIfExists('hardiksatasiya_sotest_events_events');
        }
    }
    

    然后,我们只需要使用适当的选项添加关系

    public $belongsToMany =[
        'skills' => [
            'HardikSatasiya\SoTest\Models\Skills',
            'table' => 'hardiksatasiya_sotest_events_skills',
            'order' => 'title'
        ],
        'related_events' => [
            'HardikSatasiya\SoTest\Models\Events',
            'table' => 'hardiksatasiya_sotest_events_events',
            'order' => 'title',
            'key' => 'events_id',
            'otherKey' => 'related_events_id'
        ]
    ];
    

    对于这个关系,我们指定event_id 用于主要事件,related_events_id 用于我们添加为相关事件的其他事件。 config_relation.yaml

    # ===================================
    #  Relation Behavior Config
    # ===================================
    
    skills:
        label: Skill
        view:
            list: $/hardiksatasiya/sotest/models/skills/columns.yaml
            toolbarButtons: add|remove
        manage:
            list: $/hardiksatasiya/sotest/models/skills/columns.yaml
            form: $/hardiksatasiya/sotest/models/skills/fields.yaml
    
    related_events:
        label: Events
        view:
            list: $/hardiksatasiya/sotest/models/events/columns.yaml
            toolbarButtons: add|remove
        manage:
            list: $/hardiksatasiya/sotest/models/events/columns.yaml
            form: $/hardiksatasiya/sotest/models/events/fields.yaml
    

    事件模态字段$/hardiksatasiya/sotest/models/events/fields.yaml

    fields:
        title:
            label: Title
            span: auto
            type: text
        description:
            label: Description
            size: ''
            span: auto
            type: textarea
        skills:
            label: Skills
            type: partial
            path: $/hardiksatasiya/sotest/controllers/events/_relation_skills.htm
        related_events:
            label: Events
            type: partial
            path: $/hardiksatasiya/sotest/controllers/events/_related_events.htm
    

    现在部分_related_events.htm

    <?= $this->relationRender('related_events') ?>
    

    结果

    在代码中访问

    use HardikSatasiya\SoTest\Models\Events as EventsModel;
    
    function onStart() {
        $this['event'] = $event = EventsModel::first();
        dd($event->related_events);
    }
    

    如有任何疑问,请发表评论。

    【讨论】:

    • 非常感谢,哈迪克。感谢您清晰而完整的回答,我为类似问题找到了一个很好的解决方案!非常感谢!
    • 快速跟进;我无法在我的页面上输出相关事件。当我 dd() 每次都得到 null 的输出。有什么变化吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 2019-01-31
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多