2010-05-13 6 views
4

모델 -> 쿼리 함수를 사용하지 않고 케이크에 "insert ignore"하는 방법이 있습니까?Cakephp 삽입 기능 무시?

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 솔루션이 아니지만 앱 수준에서 이러한 상황을 처리하려면 유효성 검사 규칙을 사용하십시오. 모델의 guid 필드에 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

-1

"걱정하지 않는다"

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

오류가 생성 이 경고는 케이크 자체가 아니라 MySql에 의해 원래 생성 된 것이기 때문에 CakePHP에서 간단한 플래그 또는 옵션을 사용할 수 있습니다. guid에서 고유 한 기능이 필요하지 않은 경우 일부 인덱스 변경 쿼리를 수행해야합니다.

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

너무 많은 "해결책이 없습니까?" – SeanDowney

+0

나는 mysql이 'do not care'라고 말하기를 두려워한다. :) – Young