CakePHP добавление к нескольким таблицам из одного представления

может кто-нибудь дать объяснение для меня?

У меня есть база данных, в которой я пытаюсь обновить 4 таблицы с одной страницы: Organizations, OrganizationsDetails, Account, AccountRoles. Само представление добавления будет содержать поля для учетной записи и организации. Когда я вызываю функцию добавления OrganizationsController, я хочу затем вызвать add для AccountController, AccountRolesController (установить учетную запись в качестве роли администратора) и OrganizationDetailsController (установить эту учетную запись в качестве администратора для этой конкретной организации).

Должен ли я использовать компоненты для этого? Когда я вызываю add() для организаций, я всегда намереваюсь выполнить эти шаги — никогда не создавать только запись «Организации» ниже. Должен ли я делать это непосредственно в этой функции или в каком-то другом методе?

Дайте мне знать, если мне нужно объяснить больше, спасибо!

РЕДАКТИРОВАТЬ: добавлены четыре модели ниже: Организация

class Organization extends AppModel {
    public $hasMany = array(
        'Account' => array(
            'className' => 'Account',
            'foreignKey' => 'organization_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
    public $hasOne = array(
        'OrganizationDetail' => array(
            'className' => 'OrganizationDetail',
            'foreignKey' => 'organization_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

ОрганизацияПодробнее

class OrganizationDetail extends AppModel {
    public $belongsTo = array(
        'Organization' => array(
            'className' => 'Organization',
            'foreignKey' => 'organization_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Account' => array(
            'className' => 'Account',
            'foreignKey' => 'account_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

AccountRole

class AccountRole extends AppModel {

    public $belongsTo = array(
        'Account' => array(
            'className' => 'Account',
            'foreignKey' => 'account_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Role' => array(
            'className' => 'Role',
            'foreignKey' => 'role_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

Счет

class Account extends AppModel {
    public $belongsTo = array(
        'Organization' => array(
            'className' => 'Organization',
            'foreignKey' => 'organization_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

    public $hasOne = array(
        'OrganizationDetail' => array(
            'className' => 'OrganizationDetail',
            'foreignKey' => 'account_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

    public $hasMany = array(
        'AccountRole' => array(
            'className' => 'AccountRole',
            'foreignKey' => 'account_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

person user2936644    schedule 23.10.2015    source источник
comment
Какую версию вы используете в cakephp?   -  person Karthik Keyan    schedule 23.10.2015
comment
2.7. Я также думаю, должна ли это быть новая пользовательская модель, запрашивающая эти 4 таблицы? Или правило вообще 1 модель - 1 таблица БД.   -  person user2936644    schedule 23.10.2015
comment
Не могли бы вы показать свои модельные ассоциации? Если все эти модели правильно связаны друг с другом, вы должны иметь возможность устанавливать значения в массиве $this->request->data и выполнять метод save() соответствующего типа для захвата всех связанных данных за один раз из OrganizationsController.   -  person array-pop-tarts    schedule 24.10.2015
comment
Добавлены четыре ассоциации модели выше.   -  person user2936644    schedule 25.10.2015
comment
Я предложил эту правку, но был отклонен. Пожалуйста, отредактируйте вопрос самостоятельно, чтобы уменьшить его длину.   -  person Inigo Flores    schedule 28.11.2015


Ответы (1)


Вы ошибаетесь во всей идее MVC. Контроллеры не должны вызывать методы в других контроллерах (или, по крайней мере, не в этом сценарии).

Правильным подходом было бы настроить OrganizationsController->add() так, чтобы он сохранял все данные с помощью независимых вызовов каждой Model->save($data) или с помощью

Organization->saveAssociated($data,array('deep' => true))

Ваши поля формы должны быть правильно названы, чтобы это работало. Например:

echo $this->Form->create('Organization', array('action' => 'add'));
echo $this->Form->input('Organization.name'));
echo $this->Form->input('Account.0.name', array('label' => 'Account name'));
echo $this->Form->input('OrganizationDetail.details', array('label' => 'Org. Details'));
echo $this->Form->input('Account.0.AccountRole.id', array('label' => 'Account Role'));
echo $this->Form->end('Add');

Однако у вас могут возникнуть проблемы, если вы попытаетесь пройти слишком много уровней вглубь. Если вы окажетесь в такой ситуации, возможно, это связано с тем, что ваша модель данных ошибочна.

Вот как в настоящее время выглядит ваша модель данных:

Модель данных

Вот как, по моему мнению, это должно выглядеть:

Модель нормализованных данных

Очень важно иметь модель данных прямо перед тем, как вы начнете программировать. Это может избавить вас от многих головных болей!

person Inigo Flores    schedule 28.11.2015