在 ManyToOne 反转实体中允许空值
Allow null values in ManyToOne inversed entity
我有这个实体:
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
类型提示,我会收到此错误:
Catchable Fatal Error: Argument 1 passed to
AppBundle\Entity\Brand::setCompany() must be an instance of
AppBundleEntity\Company, null given, called in
/var/www/html/backend/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php
on line 410 and defined
我将 属性 设置为 nullable
但我无法从数据中删除该对象,为什么?如何解决?
这听起来像是缓存问题。错误出在您所说的修改方法上。如果您使用的是 Zend OPCache 之类的东西,请尝试 restarting/disabling。似乎使用了旧的 class 定义。
注意: 您也可以 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+ 的方式,所以如果可以的话我建议切换。
只需修改 setCompany 方法,如下所示
public function setCompany(Company $company=null)
{
$this->company = $company;
return $this;
}
我有这个实体:
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
类型提示,我会收到此错误:
Catchable Fatal Error: Argument 1 passed to AppBundle\Entity\Brand::setCompany() must be an instance of AppBundleEntity\Company, null given, called in /var/www/html/backend/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php on line 410 and defined
我将 属性 设置为 nullable
但我无法从数据中删除该对象,为什么?如何解决?
这听起来像是缓存问题。错误出在您所说的修改方法上。如果您使用的是 Zend OPCache 之类的东西,请尝试 restarting/disabling。似乎使用了旧的 class 定义。
注意: 您也可以 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+ 的方式,所以如果可以的话我建议切换。
只需修改 setCompany 方法,如下所示
public function setCompany(Company $company=null)
{
$this->company = $company;
return $this;
}