2015-10-23 4 views
0

может кто-нибудь дать мне объяснение?CakePHP добавление нескольких таблиц с одного взгляда

У меня есть база данных, где я пытаюсь обновить 4 таблицы с одной страницы, организации, организацииПодробности, учетная запись, учетные записи. В самом представлении добавления будут отображаться поля для Учетной записи и Организации. Когда я вызываю функцию AddController OrganizationController, я хочу затем вызвать add на AccountController, AccountRolesController (установить учетную запись как роль администратора) и OrganizationDetailsController (установить эту учетную запись в качестве администратора для этой конкретной организации).

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

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

EDIT: Добавлены четыре модели ниже: Организация

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' => '' 
     ) 
    ); 

OrganizationDetail

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' => '' 
     ) 
    ); 
+0

Какую версию вы используете в cakephp? –

+0

2.7. Я также думаю, должна ли эта новая пользовательская модель запрашивать эти 4 таблицы? Или правило обычно 1 Model-1 DB table. – user2936644

+0

Не могли бы вы показать свои ассоциации моделей?Если все эти модели правильно связаны друг с другом, вы должны иметь возможность устанавливать значения в массиве '$ this-> request-> data' и выполнять соответствующий тип метода save() для захвата всех связанных данных в одном перейдите из организацииController. –

ответ

0

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

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

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'); 

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

Это то, что ваша модель данных в настоящее время выглядит следующим образом:

Data Model

Это то, что я считаю, он должен выглядеть следующим образом:

Normalized Data Model

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

Смежные вопросы