Insert/Delete 自引用 belongsToMany 关联的方法
Insert/Delete methods for self-referencing belongsToMany association
我正在努力处理自引用的 belongsToMany 关联。明确一点,我有一个模型 table,每个模型可以有多个配件,这些配件也是模型。所以我有一个链接 table,附件,有一个 model_id(“父”模型)和一个 accessory_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'));
}
该视图只是一个 select 下拉列表,其中包含所有可用模型的列表(我使用的是插件 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()
函数在从表单获取提交的数据时不起作用。我看到了问题,因为在发布插入的值时,只给出了一个 accessory_id 的数组(例如 ['accessory_id' => 1]
并且 link()
不知道如何处理它。所以我认为这是关于数据格式的问题,但不知道如何正确获取它。
保存 links(与任何其他 ORM 保存方法一样)需要传递实体,其他任何内容都将被忽略或触发错误。
所以你必须先使用 accessory_id
来获取一个实体,比如:
$accessoryId = $this->getRequest()->getData('accessory_id');
$accessory = $this->Models->AccessoryModels->get($accessoryId);
此外,您需要使用对应于您想要 link(第一个参数)的目标实体(第二个参数)的 model/table,即您必须使用 AccessoryModels
,喜欢:
$this->Models->AccessoryModels->link($model, [$accessory])
另见
我正在努力处理自引用的 belongsToMany 关联。明确一点,我有一个模型 table,每个模型可以有多个配件,这些配件也是模型。所以我有一个链接 table,附件,有一个 model_id(“父”模型)和一个 accessory_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'));
}
该视图只是一个 select 下拉列表,其中包含所有可用模型的列表(我使用的是插件 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()
函数在从表单获取提交的数据时不起作用。我看到了问题,因为在发布插入的值时,只给出了一个 accessory_id 的数组(例如 ['accessory_id' => 1]
并且 link()
不知道如何处理它。所以我认为这是关于数据格式的问题,但不知道如何正确获取它。
保存 links(与任何其他 ORM 保存方法一样)需要传递实体,其他任何内容都将被忽略或触发错误。
所以你必须先使用 accessory_id
来获取一个实体,比如:
$accessoryId = $this->getRequest()->getData('accessory_id');
$accessory = $this->Models->AccessoryModels->get($accessoryId);
此外,您需要使用对应于您想要 link(第一个参数)的目标实体(第二个参数)的 model/table,即您必须使用 AccessoryModels
,喜欢:
$this->Models->AccessoryModels->link($model, [$accessory])
另见