2011-06-06 52 views
0

我有模型人与电话/电子邮件与HABTM关系。经过一番痛苦后,我发现,当我打破HABTM成为时,我的生活变得更加轻松:人有许多人电话,电话有许多人电话,人电话归属于(人,电话)。那么,我现在不需要任何帮助:-)现在,我的问题是不同的:CakePHP透明保存唯一数据

在我可以将人员与他的电话或电子邮件配对之前,我需要保存此电话/电子邮件,然后获取其ID。

现在我想只保存独特的电话和电子邮件独特,所以我在app_model.php创造了这个方法:

function saveUnique($data = null, $unique_fieldname = null) 
{ 
    if (! $data) { return false; } 
    if (! $unique_fieldname) { return false; } 

    $id = $this->field('id', array($unique_fieldname => $data[$this->name][$unique_fieldname])); 

    if ($id) 
    { 
     $this->read(null, $id); 
    } 
    else 
    { 
     $this->create(); 
     $this->set($data); 
     if (! $this->validates()) { return false; } 
     if (! $this->save()) { return false; } 
    }   
    return true; 
} 

看来工作,但我所有新来的CakePHP。 CakePHP guru如何解决这个功能/方法?

非常感谢您的时间。

-Petr

回答

1

如果我是你,我会坚持使用默认的Cake功能,而不是你正在做的事情。所有这些功能都嵌入到Cake中,为什么要重新发明轮子?

首先,HABTM关系已经在您打破它们的情况下发挥作用。您可以通过在模型关联中添加来访问连接模型。这应该使您能够访问交点表数据。

$hasAndBelongsToMany = array(
    'Phone' => array(
     'className'    => 'Phone', 
     'joinTable'    => 'persons_phones', 
     'foreignKey'    => 'person_id', 
     'associationForeignKey' => 'phone_id', 
     'unique'     => false, 
     'with'   => 'PersonsPhones' 
    ) 
); 

只要你的独特的电话和电子邮件的要求去,为什么不使用蛋糕的内置验证来检查你?这样,你只需调用save函数,然后Cake会为你做所有的检查。

例如,如果一个人只有一个电子邮件地址,那么在人员模型中执行此操作。这将验证输入是电子邮件地址,并且它是数据库中唯一的电子邮件地址。您可以对任何字段进行此验证,并轻松构建自定义验证规则。

public $validate = array(
    'email' => array(
     'email' => array(
      'rule' => 'email', 
      'message' => 'You must enter an email address.' 
     ), 
     'isUnique' => array(
      'rule' => 'isUnique', 
      'message' => 'An account with this email address already exists.' 
     ) 
    ) 
); 

我认为您为什么会将HABTM用于电子邮件地址是有原因的。通常,人们不会共享电子邮件地址,因此许多人可能会建立更好的关系。我可以看到它适用于手机,因为人们经常分享电话号码。我这样说是为了确保HABTM是你真正想要使用的关系。

+0

那么,“与”的东西对我来说是新的。我会试试看,谢谢。我不记得我在与本地HABTM功能打交道时遇到的所有问题,但是,例如,如果我只想向一个人添加一个电话号码,该怎么办?有没有办法做到这一点?它始终删除people_phones表中以前保存的所有关系。 – 2011-06-06 12:34:30

+0

HABTM关系中的“唯一”属性可防止模型覆盖以前的记录,因此如果将唯一设置为false,则它将更像常规模型。 – 2011-06-06 12:45:46

+0

在2.1中可以。谢谢。 – Eugen 2012-04-30 20:06:58

0

我只是一直在使用CakePHP了几个月,但我会实现它有点不同。

我想在我的PeopleEmail表(在PeoplePhone中执行相同的操作)在person_id & email_id上添加一个UNIQUE索引。这样我们就不会意外地保存重复数据,我们的物理原理图可以防止重复记录被存储之前。

现在我们只需留意抛出的SQL错误。我还没有深入到Cake的这方面,但我知道基础AppModel类有一个onError()方法,可以在这方面提供有用的信息。

+0

虽然这并没有做适当的验证。尽管最终结果是相同的(数据不会因为MySQL错误而保存),但CakePHP验证器将实现相同的功能,并允许您使用Cake中的调试和通知系统来提醒用户记录已存在。 – 2011-06-06 12:50:19