到处找,但找不到我问题的答案。我想知道 doctrine (symfony) 是否有可能在不制作实体的情况下保存字符串数组。
例如:单个用户有多个邮件地址(一对多)。我不想使用邮件地址保存任何其他元数据。例如:
<?php
class User {
private $mailAddresses = array();
// ...
public function addEmailAddress($address) {
$this->mailAddresses[] = $address;
}
// ....
}
$user = new User();
$user->addEmailAddress('test@test.com');
$user->addEmailAddress('anotherone@test.com');
$addresses - $user->getEmailAddresses();
// $addresses is a simple array like: array('test@test.com','anotherone@test.com');
是这样的事情,还是我必须创建一个UserEmailAddressEntity才能使用一对多关系?
我会使用 simple_array 而不是数组,因为在您的情况下,既不保存数组的索引也不保存数据类型,因此您不需要序列化。simple_array基本上只是
implode(',', $array);
因此,您将在数据库中获得普通的昏迷分隔电子邮件,这很容易查询。更少的空间,更少的不必要的符号,更快的操作。
实体注释将是:
/**
* @ORMColumn(type="simple_array")
*/
或者,如果您使用的是 YAML:
fields:
[...]
emails:
type: simple_array
[...]
如果您出于任何原因自己制作表格,请在电子邮件列中添加注释"(DC2Type:simple_array)"。
如果您需要存储关联数组,请考虑使用数组而不是simple_array。
如果你只需要一个简单的字符串数组,你可以使用 array
类型:
/**
* @ORMColumn(type="array")
*/
private $emailAddresses = [];
Doctrine 会将其存储为序列化字符串,但从实体的角度来看,它将是一个数组。
如果您需要对单个元素进行更多控制,而无需通过 setter 修改整个数组,则可以自由创建添加/管理电子邮件地址的方法(例如您的 addEmailAddress()
)。
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#array-types