CakePHP协会一个模型专门为三个人中的一个?

时间:2012-02-20 10:56:11

标签: database cakephp model associations

我在设计数据库和围绕它的CakePHP代码时遇到了问题。

我有4个模特,

  • 服务器名称
  • 的虚
  • ServerHousing
  • ManagedServer

在ServerName中,我想保存所有ServerNames,然后可以在其他三个模型中的任何一个中使用。我怎样才能实现,我只能将一个ServerName链接到其他模型之一?

提前谢谢你们。

编辑:

我现在做的有点不同了。首先,它需要在模型本身中完成。 我在cakePHP的模型中使用了validate选项。

代码是这样的:

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 :(得分:0)

您无法在模型图层上执行此操作。模型要么关联,要么不关联。您可能正在寻找的是Controller中的一些逻辑,用于检查ServerName X的行是否已在任何其他模型中保存,然后再从另一个模型保存。

beforeSave功能对此非常有用。例如,在您的Controller中,输入:

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;
}

希望这会让你朝着正确的方向前进。