我的 Octobercms 数据透视表获取模型表在我尝试添加时应获取的数据

Posted

技术标签:

【中文标题】我的 Octobercms 数据透视表获取模型表在我尝试添加时应获取的数据【英文标题】:My Octobercms pivot table gets the data that model table should get when i try to add to it 【发布时间】:2016-07-23 11:05:31 【问题描述】:

我有一个烦人的问题,使用最新的 OctoberCMS 版本 (318),它试图将错误的数据保存到数据透视表而不是模型表。

我有一个模型企业和一个模型营业时间:

企业模型

`public $table = 'ekstremedia_emcityportal_businesses';`
`public $belongsToMany = [
    'openinghours' => [
            'Ekstremedia\EmCityportal\Models\Openinghours',
            'table' => 'ekstremedia_emcityportal_ohb',
            'order' => 'week_day',
            'week_day' => 'week_day',
            'name' => 'week_day',
    ]           
];`    

ekstremedia_emcityportal_ohb 是带有business_idopeninghours_id 的数据透视表

营业时间的型号:

public $table = 'ekstremedia_emcityportal_openinghours';
public $belongsToMany = [
        'businesses' => ['Ekstremedia\EmCityportal\Models\Business',
        'table' => 'ekstremedia_emcityportal_businesses',
        'order' => 'created_at desc'       
  ]
];   

在业务控制器field.yaml 我已经这样做了,以增加业务的营业时间:

    openinghours:
        type: repeater
        label: 'Åpningstider'
        tab: 'Åpningstider'
        form:
            fields:
                week_day:
                    label: Dag
                    oc.commentPosition: ''
                    options:
                        1: Måndag
                        2: Tysdag
                        3: Onsdag
                        4: Torsdag
                        5: Fredag
                        6: Laurdag
                        7: Sundag
                    span: left
                    type: dropdown
                open_hour:
                    label: Date added
                    type: datepicker
                    mode: time
                close_hour:
                    mode: time
                    label: Date added
                    type: datepicker

问题是,october 试图将营业时间保存到数据透视表而不是模型表。有人知道我该如何解决吗?我尝试了很多不同的选择。 .

这是我在后端遇到的错误:

 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'close_hour' in 'field list' (SQL: insert into 'ekstremedia_emcityportal_ohb' ('business_id', 'close_hour', 'open_hour', 'openinghours_id', 'week_day')...

close_houropen_houropeninghours_idweek_day 等在 ekstremedia_emcityportal_openinghours 中,在 Openinghours 模型中定义,而不是在 ekstremedia_emcityportal_ohb 中,这是数据透视表...

【问题讨论】:

【参考方案1】:

您好,我认为您的案例是一个复杂的关系场景,对于 10 月 cms 作为为您处理此问题的工具,relation behavior 实际上表单行为足以满足简单的关系,或者当您链接后认为您拥有创建它们。

在这里你试图同时创建一个存档。 有一个pretty good ressource about it,我认为理解关系行为就足够了。

但是营业时间是否属于多个企业?

【讨论】:

【参考方案2】:

您的错误是 10 月默认表单保护程序的正常行为。

默认情况下,自动生成的表单以保存十月使用trait Backend\Traits\FormModelSaver。 thatit 只能用于:

'belongsTo' 'hasOne' 'morphOne'

您可以重新定义保存方法以允许 october 使用您的模型。例如我重新定义创建:

namespace Local\Test\Controllers;

class Business extends Controller

        use \Backend\Traits\FormModelSaver;

        public $implement = ['Backend\Behaviors\ListController','Local\Test\Controllers\FormController'];


namespace Local\Test\Controllers;

use Backend\Behaviors\FormController as BaseFormController;
use Local\Test\Models\Openinghours;
use Flash;

class FormController extends BaseFormController

    /**
     * Ajax handler for saving from the creation form.
     * @return mixed
     */
    public function create_onSave($context = null)
    
        $this->context = strlen($context) ? $context : $this->getConfig('create[context]', self::CONTEXT_CREATE);
        $model = $this->controller->formCreateModelObject();
        $this->initForm($model);

        $this->controller->formBeforeSave($model);
        $this->controller->formBeforeCreate($model);

        $savedData = $this->formWidget->getSaveData();
        $openHours = $savedData['openinghours'];
        unset($savedData['openinghours']);
        $modelsToSave = $this->prepareModelsToSave($model, $savedData);

        foreach ($modelsToSave as $modelToSave) 
            $modelToSave->save(null, $this->formWidget->getSessionKey());
        

        foreach ($openHours as $formOpeninghours ) 
            $oph = new Openinghours();
            $oph->week_day = $formOpeninghours['week_day'];
            $oph->open_hour = $formOpeninghours['open_hour'];
            $oph->close_hour = $formOpeninghours['close_hour'];
            $model->openinghours()->save($oph);
        

        $this->controller->formAfterSave($model);
        $this->controller->formAfterCreate($model);

        Flash::success($this->getLang('create[flashSave]', 'backend::lang.form.create_success'));

        if ($redirect = $this->makeRedirect('create', $model)) 
            return $redirect;
        
    

【讨论】:

好的,但开放时间项目是否仍会在后端显示并可编辑? 据我了解,您现在询问更新记录。如果你类比 create_onSave 改变 update_onSave 动作,october 可以更新记录。对于视图,您可以使用部分模板,它允许您显示您需要的数据。

以上是关于我的 Octobercms 数据透视表获取模型表在我尝试添加时应获取的数据的主要内容,如果未能解决你的问题,请参考以下文章

数据模型表在数据透视表字段列表中可见,但在数据模型本身中不可见 - Excel 2016

使用现有表模式上的数据透视表在雄辩模型中指定关系字段

OctoberCMS - 具有多对多关系的模型查询

如何获取附加数据透视表的数据?

Excel VBA获取选定数据透视表行的项目详细信息

如何使用或过滤器从 Excel 中的 OLAP 多维数据集数据透视表中获取数据