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
}