【问题标题】:CakePHP transparent saving of unique dataCakePHP 透明保存唯一数据
【发布时间】:2011-09-09 06:02:45
【问题描述】:

我有具有 HABTM 关系的模型 Person 和 Phone/Email。经过一番痛苦后,我发现,当我将 HABTM 分解为:Person hasMany PeoplePhone,Phone hasMany PeoplePhone,PeoplePhone 属于(Person,Phone)时,我发现我的生活变得更轻松了。好吧,我现在不需要任何帮助 :-),我的问题不同了:

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

非常感谢您的宝贵时间。

-彼得

【问题讨论】:

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


    【解决方案1】:

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

    首先,HABTM 关系在您打破它们时已经有效。您可以通过在模型关联中添加 with 来访问连接模型。这应该可以让您访问交集表数据。

    $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 作为电子邮件地址是有原因的。通常,人们不会共享电子邮件地址,因此 hasMany 可能会是更好的关系。我可以看到它适用于电话,因为人们经常共享电话号码。我这样说是为了让您确定 HABTM 是您真正想要使用的关系。

    【讨论】:

    • 嗯,“with”对我来说是新事物。我试试看,谢谢。我不记得在使用本地 HABTM 功能时遇到的所有问题,但是,例如,如果我只想为一个人添加一个电话号码怎么办?有没有办法做到这一点?它总是删除 people_phones 表中所有以前保存的关系。
    • HABTM 关系中的“unique”属性可防止模型覆盖以前的记录,因此如果将 unique 设置为 false,它将表现得更像常规模型。
    【解决方案2】:

    我只用了几个月的 CakePHP,但我会用不同的方式来实现它。

    我会在我的 PeopleEmail 表中的 person_idemail_id 上添加一个唯一索引(在 PeoplePhone 中做同样的事情)。这样我们就不会意外保存重复数据,我们的物理原理图甚至可以在记录被存储之前防止重复记录。

    现在我们只需要留意引发的 SQL 错误。我还没有深入研究 Cake 的这方面,但我知道基础 AppModel 类有一个 onError() 方法,可能在这方面很有用。

    【讨论】:

    • 但这并没有进行适当的验证。虽然最终结果是相同的(由于 MySQL 错误,数据不会保存),但 CakePHP 验证器将实现相同的功能,并允许您使用 cake 中的调试和通知系统来提醒用户一条记录已经存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多