我有电子邮件发送系统,将它们存储在数据库中,CRON负责发送它们。我想将需要包含在此邮件中的实体对象直接保存在电子邮件实体内容列中(列类型为对象)。
我有查询,它从其他实体获取部分,但教义保存的列与我要求的列不同。这会导致电子邮件中的数据为空。
我不知道我是否清楚地解释了自己,如果是这样,我会回答任何不清楚的问题。
电子邮件实体:
/**
* Email
*
* @ORMEntity
* @ORMTable(name="email")
*/
class Email
{
const STATUS_WAITING = 'waiting';
const STATUS_SENT = 'sent';
const STATUS_FAILED = 'failed';
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="language", type="string", length=10, nullable=true)
*/
private $language;
/**
* @var text
*
* @ORMColumn(type="string", length=10)
*/
private $status;
/**
* @var object
*
* @ORMColumn(type="object")
*/
private $content;
}
包含所有必要数据的嵌入式电子邮件对象(这不是实体):
class BaseMail
{
/**
* @var string
*/
protected $from;
/**
* @var string from translation file
*/
protected $subject;
/**
* @var string
*/
protected $plainTemplate;
/**
* @var string
*/
protected $htmlTemplate;
/**
* @var array
*/
protected $options;
public function __construct(array $options = array())
{
$this->options = $options;
}
}
法典:
$order = $this->getDoctrine()->getRepository('AppBundle:Order')->findWithSomeUserPartialsFieldsAndRelations($id);
$email = new BaseEmail(array('object' => $order'));
$emailEntity = new Email();
$emailEntity->setContent($email);
现在,即使$order
有关于User
实体的字段,它们也不会保存到电子邮件内容列中。所以如果我想做这样的事情:
$order = $emailEntity->getContent()->getObject();
$userFirstName = $order->getUser()->getFirstname()
我得到NULL
;
可能你选择的解决方案需要序列化/反序列化实体,但不建议将其作为常用方法。
更多信息如何操作:http://doctrine-orm.readthedocs.org/en/latest/cookbook/entities-in-session.html
但是,您将不是会话,而是将序列化实体存储到数据库
该解决方案可以为您带来许多糟糕的惊喜,并准备好迎接挑战。如果您采用这种方式,我建议您使用 JMSSerializationBundle https://github.com/schmittjoh/JMSSerializerBundle,它具有处理实体序列化的高级方法。
也不要忘记反序列化后的"合并"实体
@ORMColumn(type="object")
不存在。你应该在你的两个人之间建立一种关系,正好是一个@ORMManyToOne()
唯一的缺点是,如果对象在邮件创建之间和 cron 之前发生更改,则不会保留对象的先前状态,并且如果您的逻辑依赖于它,则可能会生成错误或错误的电子邮件。
关于关系映射的学说文档:https://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html