Вставить / удалить методы для самостоятельной ссылки на принадлежащие ToMany ассоциации - PullRequest
0 голосов
/ 30 сентября 2019

Я борюсь с принадлежащей самому себе ассоциацией ToMany. Чтобы было ясно, у меня есть таблица моделей, и каждая модель может иметь несколько аксессуаров, которые также являются моделями. Итак, у меня есть таблица ссылок, Аксессуары, с 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'
]);

Я также получил работу по извлечению этих данных в представлении Models.

Но теперь у меня есть некоторые проблемы для метода addAccessory (и deleteAccessory) в контроллере Models и представлениях.

Вот это в контроллере:

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() не будет работать при получении отправленных данных из формы. Я вижу проблему, поскольку при публикации вставленных значений дается только массив с одним accessory_id (например, ['accessory_id' => 1], а link() не знает, что с ним делать. Поэтому я думаю, что это проблема форматирования данныхно не понимаю, как правильно его получить.

1 Ответ

0 голосов
/ 30 сентября 2019

Сохранение ссылок (как и любых других методов сохранения ORM) требует передачи сущностей, все остальное будет либо проигнорировано, либо вызовет ошибки.

Поэтому вы должны сначала использовать accessory_id, чтобы получить сущность,что-то вроде:

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

Более того, вам нужно использовать модель / таблицу, которая соответствует целевым объектам (второй аргумент), которые вы хотите связать (с первым аргументом), т.е. вам придется использоватьAccessoryModels, например:

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

См. Также

...