Как установить значение для дополнительного столбца в сводной таблице в OctoberCMS? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть doctor и specialization таблица, и у меня doctor_specialization_pivot таблица. В моей сводной таблице у меня есть следующие столбцы:

| doctor_id | additional_data | specialization_id |

additional_data из модели doctor вместе с doctor_id.

В моем doctor файл модели, у меня есть эти отношения:

public $belongsToMany = [
    'specialization' => [
        'path\to\specialization\model', 
        'table' => 'doctor_specialization_pivot', 
        'parentKey' => 'doctor_id', 
        'otherKey' => 'specialization_id',
    ]
];

Теперь при отправке формы я получаю эту ошибку:

SQLSTATE[HY000]: General error: 1364 Field 'additional_data' doesn't have a default value (SQL: insert into doctor_specialization_pivot (doctor_id, specializations_id) values (1, 3))"

Я пытался добавив к моим отношениям 'pivot' => ['additional_data']. Но все равно получаю ту же ошибку.

Я проверил отправленные данные и additional_data не пусто. Я проверил на форумах OctoberCMS, но не получил прямых ответов, таких как this и this .

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Хорошо. Я нашел ответ на свой вопрос.

Я подробно отвечу, чтобы помочь всем. После копания и слепой стрельбы. Согласно этой документации здесь , мы можем использовать метод attach() , чтобы прикрепить роль к пользователю, вставив запись в промежуточную таблицу, которая объединяет модели .

Что меня смущает в документации, так это то, что она использует переменную $roleId, и я не понимаю, откуда взялся $roleId. Если это id родительской таблицы или id другой таблицы.

Пример по ссылке:

$user = User::find(1);

$user->roles()->attach($roleId);

Итак, что я сделал в моей модели doctor, Я подключаюсь к событию beforeSave, использую отношение ($this->specialization) в качестве первого параметра вместо id в документах. $this->specialization() - это тоже отношение, определенное в belongsToMany.

Ответ:

public function beforeSave()
{
    $this->specialization()->attach($this->specialization,['additional_data' => 'additional data from doctor table']);
}
0 голосов
/ 10 апреля 2020

Я просто собираюсь дать новый ответ и предположить, что это то, что вам нужно, потому что вы еще не показали какой-либо код о том, как работает ваша форма. Вот так я бы обновил сводную информацию из формы внешнего интерфейса.

Отношение в model.php:

public $belongsToMany = [
    'specialization' => [
        'path\to\specialization\model', 
        'table' => 'doctor_specialization_pivot', 
        'parentKey' => 'doctor_id', 
        'otherKey' => 'specialization_id',
        'pivot' => ['additional_data'] //This is required
    ]
];

Тогда в некотором коде php давайте назовем его onAddSpecialization():

public function onAddSpecialization() {
    //Calling a function to get the doctor id maybe from the signed in user
    $doctor = Doctors::find($this->$doctorId());

    //We get our Specialization from an input
    $specialization = Specialization::find(Input::get('specialization_id'));

    //We get our additional data from an input
    $additional_data = Input::get('additional_data');

    //Now we are going to attach the information
    $doctor->specialization()->attach($specialization, ['additional_data' => $additional_data]);
}

Теперь пример обновления наших дополнительных данных:

public function onUpdateAdditionalData() {
    //Calling a function to get the doctor id maybe from the signed in user
    $doctor = Doctors::find($this->$doctorId());

    //If you get specialization by id from an input. I believe you need to go through the relationship in order to access the correct pivot information.
    $specialization = $doctor->specialization->where('id', Input::get('specialization_id'))->first();

    //Insert the new pivot information
    $specialization->pivot->additional_data = $new_additional_data;

    //Save
    $specialization->pivot->save();
}
0 голосов
/ 09 апреля 2020

Реализация очень похожа на это видео от Watch Learn (Иван). Вы можете многое узнать о OctoberCMS, просто посмотрев его руководство. Вот документация также. Это пример информации, которую я сделал.

ПРЕДУПРЕЖДЕНИЕ Другой известный недостаток - вы не можете применить это к записи модели, которая еще не создана. В отличие от стандартного виджета отношений, который ждет, пока он не будет сохранен, прежде чем прикреплять записи, он прикрепляет записи в отдельной оверлейной форме.

Вот мои model.php отношения:

public $belongsToMany = [
    'equipments' => [
        'Brandon\Pixelrpg\Models\Equipments',
        'table' => 'brandon_pixelrpg_equipment_inventory',
        'key' => 'inventory',
        'otherKey' => 'equipment',
        'pivot' => ['quantity']
    ]
];

Вот мой controller.php:

public $implement = [        
    'Backend\Behaviors\ListController',
    'Backend\Behaviors\FormController',
    'Backend\Behaviors\ReorderController',
    'Backend\Behaviors\RelationController'
];

public $listConfig = 'config_list.yaml';
public $formConfig = 'config_form.yaml';
public $reorderConfig = 'config_reorder.yaml';
public $relationConfig = 'config_relation.yaml';

Вот мой config_relation.yaml:

equipments:
    label: Equipments
    view:
        list:
            columns:
                id:
                    label: ID
                    type: number
                    searchable: true
                    sortable: true
                name:
                    label: Name
                    type: text
                    searchable: true
                    sortable: true
                value:
                    label: Value
                    type: number
                    searchable: true
                    sortable: true
                updated_at:
                    label: Updated
                    type: datetime
                    searchable: true
                    sortable: true
                pivot[quantity]:
                    label: Quantity
                    type: number

    pivot:
        form:
            fields:
                pivot[quantity]:
                    label: Quantity
                    type: number
                    default: 0
...