用于自我引用的Insert / Delete方法includesToMany关联

时间:2019-09-30 15:07:37

标签: cakephp cakephp-3.0

我正在努力与自我参考的AresToMany关联相关。为了清楚起见,我有一个“模型”表,每个模型可以有多个附件,这些附件也是模型。因此,我有一个链接表,附件,其中包含一个model_id(“父”模型)和一个附件_id(“子”模型)。

我终于找到了如何在ModelsTable中声明这一点:

$this->belongsToMany('AccessoryModels', [
    'className' => 'Models',
    'through' => 'Accessories',
    'foreignKey' => 'model_id',
    'targetForeignKey' => 'accessory_id'
]);
$this->belongsToMany('ParentAccessoryModels', [
    'className' => 'Models',
    'through' => 'Accessories',
    'foreignKey' => 'accessory_id',
    'targetForeignKey' => 'model_id'
]);

我还设法在“模型”视图中检索这些数据。

但是现在我在模型控制器和视图中的addAccessory(和deleteAccessory)方法遇到了一些问题。

在控制器中:

public function addAccessory($id = null)
{
    $model = $this->Models->get($id, [
        'contain' => []
    ]);
    if ($this->getRequest()->is(['patch', 'post', 'put'])) {
        $accessory = $this->getRequest()->getData();
        if ($this->Models->link($model, [$accessory])) {
            return $this->redirect(['action' => 'view', $model->id]);
        }
    }
    $models = $this->Models
        ->find('list', ['groupField' => 'brand', 'valueField' => 'reference'])
        ->order(['brand' => 'ASC', 'reference' => 'ASC']);
    $this->set(compact('model', 'models'));
}

该视图只是带有所有可用模型列表的选择下拉列表(我使用的是AlaxosForm插件,但它采用了原始的CakePHP control()函数行为):

echo $this->AlaxosForm->label('accessory_id', __('Accessory'), ['class' => 'col-sm-2 control-label']);
echo $this->AlaxosForm->control('accessory_id', ['options' => $models, 'empty' => true, 'label' => false, 'class' => 'form-control']);
echo $this->AlaxosForm->button(___('Submit'), ['class' => 'btn btn-default']);

问题在于,从表单获取提交的数据时,addAccessory()函数将不起作用。我看到了问题,因为在发布插入的值时,只给出了一个具有一个annex_id的数组(例如['accessory_id' => 1],而link()不知道如何处理它。所以我认为这是一个有关数据格式的问题,但看不到如何正确获取。

1 个答案:

答案 0 :(得分:0)

保存链接(就像其他任何ORM保存方法一样)要求传递实体,否则任何其他操作将被忽略或触发错误。

因此,您必须先使用accessory_id来获取实体,例如:

$accessoryId = $this->getRequest()->getData('accessory_id');
$accessory = $this->Models->AccessoryModels->get($accessoryId);

此外,您需要使用与要链接(到第一个参数)的目标实体(第二个参数)相对应的模型/表,即,您必须使用AccessoryModels,例如:< / p>

$this->Models->AccessoryModels->link($model, [$accessory])

另请参见