允许ManyToOne反转实体

时间:2015-08-13 15:40:48

标签: php symfony doctrine-orm symfony-2.7

我有这个实体:

class Brand
{
    ...

    /**
     * @var Company
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="brands")
     * @ORM\JoinColumn(name="companies_id", referencedColumnName="id", nullable=true)
     */
    protected $company;

    ...

    /**
     * Set company.
     *
     * @param Company $company
     *
     * @return Brands
     */
    public function setCompany(Company $company)
    {
        $this->company = $company;
        return $this;
    }
}

如果我从方法签名中删除Company类型提示,则会收到此错误:

  

捕获致命错误:参数1传递给   AppBundle \ Entity \ Brand :: setCompany()必须是。的实例   AppBundleEntity \ Company,null给定,调用   /var/www/html/backend/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php   在第410行并定义

我将属性设置为nullable,但我无法从数据中删除对象,为什么?如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

这听起来像缓存问题。错误是在您说您修改的方法上。如果您正在使用Zend OPCache之类的东西,请尝试重新启动/禁用它。好像使用了旧的类定义。

注意:您还可以setCompany(Company $company=null)保留类型安全并允许空值(PHP 5.1+)

检查已启用内容的最简单方法是检查phpinfo()输出。如果您正在使用OPCache,那么您将在那里看到它。以下是我的开发环境的配置(在php.ini中):

[OPCACHE]
zend_extension="php_opcache.dll"
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=0
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.validate_timestamps=1

最后一个选项是重要选项 - 它会重新读取任何已更新的文件。在生产中,您希望将其设置为零(并opcache.revalidate_freq为零)以减少磁盘访问。 See more settings here

虽然像APC这样的东西仍然可以使用,但内置的Zend OPCache是​​继续使用PHP 5.5+的方法,所以我建议你切换。

答案 1 :(得分:0)

只需修改下面给出的setCompany方法

public function setCompany(Company $company=null)
{
    $this->company = $company;
    return $this;
}