0

我在 Sonata Admin 顶部有一个项目设置。我正在经历一些新的和胡说八道的事情,这是我第一次看到。我有实体Media(请参阅帖子中的定义),您可以在其中看到几乎所有内容都不可为空,事实上,如果我检查数据库架构,我可以NOT NULL在列中看到约束$title$titleHtml以及其他一些。我有一个MediaAdmin控制器(请参阅帖子中的定义)。如果我删除titleandtitleHtml和其他列中的所有内容并点击Update按钮,很惊讶我可以保存那个实体,我问自己,怎么做?这里的魔力在哪里?我很惊讶,没有逻辑解释,但问题是这是错误的,不应该发生,我该如何解决?我的代码有问题吗?为什么会这样?我正在使用 2.7.5,我正在 DEV 环境中进行测试

媒体实体

/**
 * @ORM\Entity
 * @ORM\Table(name="media", options={"collate"="utf8_general_ci"})
 */
class Media
{
    use IdentifierAutogeneratedTrait;
    use TimestampableEntity;
    use UploadTrait;

    /**
     * @var string
     * @ORM\Column(type="string", length=45, nullable=true)
     */
    protected $media_type;

    /**
     * @var string
     * @ORM\Column(type="string", length=45)
     */
    protected $title;

    /**
     * @var string
     * @ORM\Column(type="string", length=45)
     */
    protected $titleHtml;

    /**
     * @var string
     * @ORM\Column(type="text")
     */
    protected $description;

    /**
     * @var string
     * @ORM\Column(type="text")
     */
    protected $descriptionHtml;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $thumbnail_url = '';

    /**
     * @var string
     * @ORM\Column(type="string", length=255)
     */
    protected $media_url;

    /**
     * @var string
     * @ORM\Column(type="string", length=45)
     */
    protected $media_code;

    /**
     * @var bool
     * @ORM\Column(type="boolean")
     */
    protected $inactive = false;

    /**
     * @var bool
     * @ORM\Column(type="boolean")
     */
    protected $useHtml = false;

    /**
     * @var Brand
     * @ORM\ManyToOne(targetEntity="Brand")
     * @ORM\JoinColumn(name="brands_id", referencedColumnName="id")
     */
    protected $brand;

    /**
     * @ORM\ManyToMany(targetEntity="Email", mappedBy="emailsMediaXref", cascade={"persist"})
     */
    protected $mediaXrefMail;

    ....
}

媒体管理控制器

protected function configureFormFields(FormMapper $formMapper)
{
    $image = $this->getSubject();
    $fileFieldOptions = array('required' => false, 'label' => 'Thumbnail');
    $fileMediaFieldOptions = array('required' => true, 'label' => 'Media File');

    if ($image && ($webPath = $image->getThumbnailUrl())) {
        $fileFieldOptions['help'] = 'Thumbnail: <img src="'.$webPath.'" class="admin-preview img-rounded img-responsive"/>';
        $fileMediaFieldOptions['help'] = 'Type: '.$image->getMediaType().'<br/>Name: '.$image->getMediaUrl();
    }

    $formMapper
        ->with('Information', array('class' => 'col-md-6'))
            ->add('title', null, array(
                'label' => 'Title (text format)'
            ))
            ->add('titleHtml', 'ckeditor', array(
                'config_name' => 'default_config',
                'label' => 'Title (HTML format)'
            ))
            ->add('description', null, array(
                'label' => 'Description (text format)'
            ))
            ->add('descriptionHtml', 'ckeditor', array(
                'config_name' => 'default_config',
                'label' => 'Description (HTML format)',
                'attr' => array(
                    'row' => 5

            )))
            ->add('useHtml', null, array('required' => false))
            ->add('inactive', null, array('required' => false))
        ->end()
        ->with('Brand', array('class' => 'col-md-6'))
            ->add('brand', 'sonata_type_model_list', array(
                    'btn_add' => 'Add',      //Specify a custom label
                    'btn_list' => 'Select',     //which will be translated
                    'btn_delete' => false,             //or hide the button.
                    ), array(
                    'placeholder' => 'No Brand selected',
            ))
        ->end()
        ->with('Media', array('class' => 'col-md-6'))
            ->add('file', 'file', $fileFieldOptions)
            ->add('media_file', 'file', $fileMediaFieldOptions)
            ->add('media_type')
            ->add('media_code')
        ->end();
}

编辑 1:测试 1

我更改了以下代码行:

    /**
     * @var string
     * @ORM\Column(type="string", length=45)
     */
    protected $title;

对此:

    /**
     * @var string
     * @ORM\Column(type="string", length=45, nullable=false)
     */
    protected $title;

然后我运行以下命令并得到如下所示的结果:

doctrine:schema:update --force
Nothing to update - your database is already in sync with the current entity metadata.

然后我尝试通过将列title留空来更新它,我可以在查询中看到这个结果:

UPDATE media SET title = ?, titleHtml = ?, description = ?, descriptionHtml = ?, media_code = ?, updatedAt = ? WHERE id = ? [null,"sdfsdfsd",null,null,null,"2015-10-22 21:07:25",12]

我仍然不知道问题出在哪里,为什么允许这样做,有吗?

4

0 回答 0