我有模特人物和电话/电子邮件与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
答案 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()方法,可以在这方面提供帮助。