CakePHP透明保存唯一数据

时间:2011-06-06 12:02:59

标签: cakephp unique has-and-belongs-to-many

我有模特人物和电话/电子邮件与HABTM的关系。经过一些痛苦我发现,我的生活更容易,当我打破HABTM:人有很多人的电话,电话有很多人的电话,人电话属于(人,电话)。好吧,我不需要任何帮助:-)现在,我的问题是不同的:

在我将人与电话或电子邮件配对之前,我需要保存此电话/电子邮件,然后获取其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大师如何解决这个功能/方法?

非常感谢你的时间。

-Petr

2 个答案:

答案 0 :(得分:1)

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

首先,HABTM关系已经解决了。您可以通过在模型关联中添加来访问连接模型。这可以让您访问交集表数据。

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

就您的独特电话和电子邮件要求而言,为什么不使用Cake的内置验证来为您进行检查?这样,您只需调用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是您真正想要使用的关系。

答案 1 :(得分:0)

我只使用CakePHP几个月但我会实现它有点不同。

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

现在我们必须留意抛出的SQL错误。我还没有深入研究Cake的这个方面,但我知道基础AppModel类有一个onError()方法,可以在这方面提供帮助。