Работа с первичным ключом n-tuple (n> 2) таблицы соединений в OctoberCMS - PullRequest
0 голосов
/ 12 июля 2019

У меня есть схема, в которой USER находится в отношениях «многие ко многим» с TITLE до DEGREE:

USER -|--------||-> DEGREE <-||--------|- TITLE
--
# USER
-------------------
| id | user_name  |
|----|------------|
| 1  | Anthony    |
| 2  | Linda      |

# TITLE
-------------------
| id | title_name |
|----|------------|
| 1  | bachelor   |
| 2  | professor  |

# DEGREE
primaryKey:[user_id, title_id, major, university]
---------------------------------------------------------------------
| user_id | title_id   | major      | university        | year      |
|---------|------------|------------|-------------------|-----------|
| 1       | 2          |biology     | florida           |   2012    |
| 2       | 1          |math        | seoul             |   NULL    |
| 2       | 1          |physics     | tokyo             |   NULL    |
| 1       | 2          |biology     | hanoi             |   2009    |

Как видите, первичный ключ DEGREE представляет собой 4-кортеж. Следовательно, если комбинация значений этих полей первичного ключа уникальна, это допустимая запись. Я использовал сводную таблицу и правильно посмотрел на тестовый плагин OctoberCMS . Мне удается интегрировать частичное отношение DEGREE в форму создания нового USER.

/* Models\User.php */
public $belongsToMany = [
    /*...*/
    'degrees' => [
        'Xyz\Xyz_plugin\Models\Title',
        'table' => 'xyz_degree',
        'key' => 'user_id',
        'otherKey' => 'title_id',
        'pivot' => ['major', 'university, 'year'],
        'pivotModel' => 'Xyz\Xyz_plugin\Models\Degree'      // optional
    ]
];

/* Models\Degree.php */
<?php namespace Xyz\Xyz_plugin\Models;
use October\Rain\Database\Pivot;
use Model;
class Degree extends Pivot
{
    use \October\Rain\Database\Traits\Validation;

    public $rules = [];
}

После добавления шаблона форм и столбцов для DEGREE и настройки в контроллере USER частичное отношение DEGREE появилось в форме USER. Я могу создать USER с DEGREE. Но проблема в том, что Октябрь не обнаружил, и он обрабатывает модель DEGREE в виде 2-кортежно-первичного ключа [user_id, title_id]: я не могу добавить два DEGREE с одинаковым названием, например, бакалавра, потому что он пропущен в списке TITLE после создания первого DEGREE. Я аккуратно следовал коду пользователей в тестовом плагине .

Я пробую другое мышление как реструктурирование схемы: USER имеет много DEGREE, а TITLE имеет много DEGREE. Проблема заключается в том, что необходимо добавить поле Id в DEGREE, в то время как InnoDB не допускает автоинкрементное поле в составном ключе. В течение некоторого времени я хочу знать, каково правильное решение для такой схемы? Я считаю, что это общая проблема, но я не получаю достаточно хороший результат в Google. Любая помощь приветствуется.

...