flush,try catch和object

时间:2017-05-10 08:28:01

标签: php symfony doctrine

抛出错误

  

SQLSTATE [23000]:完整性约束违规:1048列“完成”不能为空

如何“告诉”实体管理器不要考虑水果对象,因为它会抛出错误?

我有一个像这样的对象:

class Fruit {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    private $id;
    /** @Column(type="string", length=10, nullable=true) */
    private $name;

    /** @Column(type="boolean") */
    private $complete;

    /* Omitted to make it simple */
}

这样的方法:

public function uploadAction(){
    try{
       /* Omitted to make it simple */
       while ($data = fgetcsv($fic, 1024, $delimiter)) {
           try {
               $fruit = $fruitManager->createFruit($data);
               $outcome_fruit = $fruit->id;
           } catch (\Exception $e) {
               $outcome_details[] = $e->getMessage();
           }
       }

       fclose($fic);
       @unlink($file_path);

       $csv_data = $this->view->io->build_csv_file($outcome_details);
       $csv_import->output_csv = base64_encode(gzencode($csv_data));
       $this->em->persist($csv_import);

       // error here
       $this->em->flush();
       //

    } catch (\Exception $e) {
       print $e->getMessage();
       exit;
    }
}

我的fruitManager

class FruitManager{
   public function createFruit($name){
      $fruit = new \Entities\Fruit;
      $fruit->name = $name;

      throw new Exception("Exception.");

      $fruit->complete = 1;
      $this->em->persist($fruit);
      $this->em->flush();
   }
} 

2 个答案:

答案 0 :(得分:2)

你几乎没有选择:

  • 使用ORM更新您的实体,允许空值,以允许此字段的空值,即/** @Column(type="boolean", nullable=true) */
  • 使用ORM /** @ORM\Column(type="boolean", nullable=false, options={"default" : false}) */
  • 使用默认值更新您的实体
  • 在实体构造函数中指定默认值
  • 使用private $complete = false;分配默认值,如Freelancer所说

根据逻辑需要,我更喜欢前两个选项中的一个。 感谢。

答案 1 :(得分:0)

尝试根据需要设置private $complete = false;或true。