2010-05-13 114 views
4

有没有办法在不使用模型 - >查询函数的情况下在“蛋糕中插入忽略”?Cakephp插入忽略功能?

  $this->Model->save(array(
       'id' => NULL, 
       'guid' => $guid, 
       'name' => $name, 
      )); 

生成错误:

Warning (512): SQL Error: 1062: Duplicate entry 'GUID.....' for key 'unique_guid' [CORE/cake/libs/model/datasources/dbo_source.php, line 524] 

这将是巨大的,可以设置一些标志或选项,上面写着“不关心”

回答

7

这不是一个真正的INSERT IGNORE解决方案,但要在应用程序级别处理这种情况,您需要使用验证规则。如果您只需将isUnique验证规则(2.x)(3.x)附加到模型中的​​字段,则如果guid已经存在,Cake将自动退出保存操作。

在幕后它会向数据库提出两个查询,而不是INSERT IGNORE会产生的查询,但这不应该是一个大问题。

一个问题可能是它会返回false这些失败的操作,您将不得不使用$this->Model->invalidFields()来找出问题所在,以及是否可以忽略它。您可以覆盖Model::save()在模型中执行此操作,因此您不必每次都在控制器中执行此操作。

在保存之前,您可能还想使用$this->Model->isUnique(array('guid' => $guid))2.x)(3.x)进行手动检查。同样,你可以重写save方法,如果guid不是唯一的,它会默默地返回true,但要小心这种事情。

+0

我同意它看起来像我需要看看其他选项。对于我的情况,我最终需要再次查询,所以这是完美的(isUnique)。我不知道有这样的功能 – SeanDowney 2010-05-14 23:08:09

-1

我不认为有这样的简单的标志或CakePHP中的选项,因为此警告最初由MySql生成,而不是蛋糕本身。如果您不需要​​上的独特功能,则必须执行一些索引更改查询。例如,

$this->Model->query("ALTER TABLE `yourdatebasename`.`yourtablename` DROP INDEX `guid` ,ADD INDEX `guid` (`guid`)"); 
+1

所以非常“没有解决方案?” – SeanDowney 2010-05-14 02:38:25

+0

我不敢让Mysql说'我不在乎'你必须这样做。:) – Young 2010-05-14 03:02:26