将实体对象保存在另一个表的列中

时间:2015-04-16 09:39:29

标签: php symfony doctrine-orm

我有电子邮件发送系统将它们存储在数据库中, CRON 负责发送它们。我想将需要直接包含在此邮件中的实体对象直接保存在电子邮件实体内容列中(列类型为对象)。

我有查询从其他实体获取部分内容,但 doctrine 会保存不同于我要求的列。这导致电子邮件中的空数据。

我不知道我是否清楚地解释了自己,如果是这样我会回答任何不明确的观点。

电子邮件实体:

/**
 * Email
 *
 * @ORM\Entity
 * @ORM\Table(name="email")
 */
class Email
{
    const STATUS_WAITING = 'waiting';
    const STATUS_SENT = 'sent';
    const STATUS_FAILED = 'failed';

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="language", type="string", length=10, nullable=true)
     */
    private $language;

    /**
     * @var text
     *
     * @ORM\Column(type="string", length=10)
     */
    private $status;

    /**
     * @var object
     *
     * @ORM\Column(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

2 个答案:

答案 0 :(得分:1)

您可能选择需要序列化/反序列化实体的解决方案,但并不建议将其作为常用方法。

更多信息如何操作: http://doctrine-orm.readthedocs.org/en/latest/cookbook/entities-in-session.html

但是,您将序列化实体存储到DB

,而不是会话

该解决方案可以为您带来许多不良意外,并为迎接挑战做好准备。如果您通过这种方式,我将建议您使用具有高级方法的JMSSerializationBundle https://github.com/schmittjoh/JMSSerializerBundle来处理实体序列化。

也不要忘记"合并"反序列化后的实体

答案 1 :(得分:0)

@ORM\Column(type="object")不存在。您应该在两个实体之间创建一个关系,恰好是@ORM\ManyToOne()

唯一的缺点是,如果对象在邮件创建之间和cron之前发生变化,则对象的先前状态不会被保留,并且如果您的逻辑依赖于它,则可能生成错误或错误的电子邮件。

关于关系映射的学说文档:https://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html