CakePHP связывает одну модель исключительно с одной из трех других? - PullRequest
0 голосов
/ 20 февраля 2012

У меня проблема с проектированием моей базы данных и кода CakePHP вокруг нее.

У меня есть 4 модели,

  • ServerName
  • VirtualMachine
  • ServerHousing
  • ManagedServer

В ServerName я хочу сохранить все ServerNames, которые затем можно использовать в любой из трех других моделей.Как я могу добиться того, чтобы я мог связать только одно имя_сервера с одной из других моделей?

Заранее спасибо, ребята.

РЕДАКТИРОВАТЬ:

Я сейчас сделалэто немного по-другому.Прежде всего это нужно сделать в самой модели.Я использовал опцию проверки в моделях CakePHP.

Код выглядит так:

public $validate = array(
    'server_name_id' => array(
        'rule' => 'serverNameTaken',
        'message' => 'This Servername has already been taken.'
    )
);

public function serverNameTaken()
{
    $this->ManagedServer = ClassRegistry::init("ManagedServer");
    // Assuming the server_name_id was passed from the form...
    $server_name_id = $this->data['VirtualMachine']['server_name_id'];

    // Check if this servername_id is already saved in virtual_machines
    if ($this->ManagedServer->find('count', array(
        'conditions' => array(
            'ManagedServer.server_name_id' => $server_name_id
        )
    )) > 0
    ) {
        // Found the server_name in the VirtualMachine model!
        return false; // Prohibit saving the data
    }

    if ($this->find('count', array(
        'conditions' => array(
            'VirtualMachine.server_name_id' => $server_name_id
        )
    )) > 0
    ) {
        // Found the server_name in the VirtualMachine model!
        return false; // Prohibit saving the data
    }


    // Do this for the other models too. If a return false is not hit by now,
    // everything should be fine and you can...
    return true;
}

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

Еще раз спасибо за ваш ответ !!!

1 Ответ

0 голосов
/ 20 февраля 2012

Вы не можете сделать это на уровне модели. Модели либо связаны, либо нет. Вероятно, вам нужна некоторая логика в вашем контроллере, которая проверяет, была ли строка для ServerName X уже сохранена в какой-либо из других моделей, прежде чем сохранять ее из другой модели.

Для этого полезна функция beforeSave . Например, в вашем контроллере, поместите это:

public $uses = array('VirtualMachine', 'ServerHousing', 'ManagedServer');

public function beforeSave() {
    // Assuming the servername_id was passed from the form...
    $servername_id = $this->request->data['servername_id'];

    // Check if this servername_id is already saved in virtual_machines
    if($this->VirtualMachine->find('count', array(
        'conditions' => array(
            'VirtualMachine.servername_id' => $servername_id
        )
    )) > 0) {
        // Found the servername in the VirtualMachine model!
        return false; // Prohibit saving the data
    }

    // Do this for the other models too. If a return false is not hit by now,
    // everything should be fine and you can...
    return true;
}

Надеюсь, что это приведет вас в правильном направлении.

...