使用HABTM连接表验证唯一字段

时间:2012-03-12 14:40:17

标签: validation cakephp model

我正在努力研究如何验证模型A中与模型B中的字段结合时应该是唯一的字段。

这是一个澄清我的问题的例子:

Page hasMany SitesPage
SitesPage belongsTo Page, belongsTo Site

Page有一个slug字段,在整个站点中应该是唯一的。页面可以附加到任何网站。

Page.id
Page.slug

SitesPage.id
SitesPage.site_id
SitesPage.page_id

我的Page模型中有一个checkUniqueSlug()自定义验证方法,但由于site_id存储在SitesPage中,因此无法验证slug对于网站是唯一的,这在Page模型验证方法中是不可用的($ this- >数据仅包含页面模型数据。)

我无法在SitesPage模型中进行验证,因为SitesPage没有slug字段,我看不到Page post是SitesPage。

如何创建自定义验证以检查slug是否为网站所特有?

一种解决方案是将slug移动到SitesPage模型中,但我们需要所有共享页面具有相同的slug。即共享的“关于我们”页面必须有一个“about_us”slug,无论该页面附加到哪个站点。

另一个解决方案是在我保存之前在控制器中执行验证哪个可以工作但是感觉不对,因为验证应该在模型中完成。

1 个答案:

答案 0 :(得分:0)

由于没有答案而其他人可能正在寻求帮助,这就是我最终得到解决方案的方法:

由于控制器是数据阵列中唯一存在两个模型数据的地方,因此必须在那里进行验证调用。

我将验证代码卸载到模型中并使用以下代码调用它:

if (!empty($this->request->data)) {

  if ($this->Model->specialMultiModelValidate($this->request->data) && $this->Model->save($this->request->data)) {

    // model has validated and saved

  }
  else {

     // model has failed to validate and save

  }

}

希望有人觉得这很有用。