Symfony3 一对多关系 __toString 错误
Symfony3 one-to-many relationship __toString error
我正在关注 symfony documentation for associations 并创建了产品和类别实体。
在我的产品实体中,我有:
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
private $category;
在我的类别实体中我有:
/**
* @ORM\OneToMany(targetEntity="Product", mappedBy="category")
*/
private $products;
下面是生成的 table 的样子:
mysql> show create table product \G
*************************** 1. row ***************************
Table: product
Create Table: CREATE TABLE `product` (
`id` bigint(20) unsigned NOT NULL,
`category_id` int(10) unsigned DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`details` text COLLATE utf8_unicode_ci COMMENT '(DC2Type:json_array)',
PRIMARY KEY (`id`),
KEY `IDX_D34A04AD12469DE2` (`category_id`),
CONSTRAINT `FK_D34A04AD12469DE2` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)
mysql> show create table category \G
*************************** 1. row ***************************
Table: category
Create Table: CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)
mysql>
我还安装了 EasyAdmin 包。现在,我转到 EasyAdmin 并打开 'Category' table 并插入一行。然后我转到 'Product' table,当我点击 'Add Product' 按钮时,出现错误:
Catchable Fatal Error: Object of class AppBundle\Entity\Category could not be converted to string
可以通过添加魔术方法 __toString 来解决问题,其中 returns $this->name 进入类别实体。
问题:
1-我做错了什么吗?为什么我需要向类别实体添加 __toString 方法?
2- 如果这是正常的,为什么 symfony 手册中没有提及?
毫无疑问,这是正常行为。我已经用 EasyAdminbundle 做过很多次了。
您必须实施 __toString()
方法。
Fields that represent an association with another entity are displayed
as lists. For that reason, you must define the __toString()
PHP method in any entity which is used in a Doctrine relation.
Otherwise you'll see an error message because the backend cannot
represent the related object as a string.
在此处的文档中:https://symfony.com/doc/current/bundles/EasyAdminBundle/book/edit-new-configuration.html
两件事:
1) 在 returns 标识实体的字符串的关系的 "many" 侧向您的实体添加 __toString() 方法。
2) 确保 __toString() 方法 returns 在任何情况下都是一个字符串,即使实体完全为空。通常你必须将 属性 即 __toString() returns 初始化为空字符串。
示例:
private $name = ''; // initialize $name as an empty string
public function __toString()
{
return $this->name; // which is a string in any circumstance
}
我正在关注 symfony documentation for associations 并创建了产品和类别实体。
在我的产品实体中,我有:
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
private $category;
在我的类别实体中我有:
/**
* @ORM\OneToMany(targetEntity="Product", mappedBy="category")
*/
private $products;
下面是生成的 table 的样子:
mysql> show create table product \G
*************************** 1. row ***************************
Table: product
Create Table: CREATE TABLE `product` (
`id` bigint(20) unsigned NOT NULL,
`category_id` int(10) unsigned DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`details` text COLLATE utf8_unicode_ci COMMENT '(DC2Type:json_array)',
PRIMARY KEY (`id`),
KEY `IDX_D34A04AD12469DE2` (`category_id`),
CONSTRAINT `FK_D34A04AD12469DE2` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)
mysql> show create table category \G
*************************** 1. row ***************************
Table: category
Create Table: CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)
mysql>
我还安装了 EasyAdmin 包。现在,我转到 EasyAdmin 并打开 'Category' table 并插入一行。然后我转到 'Product' table,当我点击 'Add Product' 按钮时,出现错误:
Catchable Fatal Error: Object of class AppBundle\Entity\Category could not be converted to string
可以通过添加魔术方法 __toString 来解决问题,其中 returns $this->name 进入类别实体。
问题:
1-我做错了什么吗?为什么我需要向类别实体添加 __toString 方法?
2- 如果这是正常的,为什么 symfony 手册中没有提及?
毫无疑问,这是正常行为。我已经用 EasyAdminbundle 做过很多次了。
您必须实施 __toString()
方法。
Fields that represent an association with another entity are displayed as lists. For that reason, you must define the __toString() PHP method in any entity which is used in a Doctrine relation. Otherwise you'll see an error message because the backend cannot represent the related object as a string.
在此处的文档中:https://symfony.com/doc/current/bundles/EasyAdminBundle/book/edit-new-configuration.html
两件事:
1) 在 returns 标识实体的字符串的关系的 "many" 侧向您的实体添加 __toString() 方法。
2) 确保 __toString() 方法 returns 在任何情况下都是一个字符串,即使实体完全为空。通常你必须将 属性 即 __toString() returns 初始化为空字符串。
示例:
private $name = ''; // initialize $name as an empty string
public function __toString()
{
return $this->name; // which is a string in any circumstance
}