我是否可以在使用 Proper 更新对象后保持水合作用


Can I maintain hydration after updating an object with Propel?

如果我像这样获取一个对象:

$q = OrderReturnQuery::create()
    ->joinWith('Type')
    ->joinWith('Status')
    ->useStatusQuery()
        ->joinWith('Email')
        ->endUse()
    ->joinWith('Priority');
$object = $q->findPk(1);
var_dump($object->toArray(TableMap::TYPE_PHPNAME, true, [], true));

这是我得到的输出:

array (size=14)
  'Id' => int 1
  'TypeId' => int 3
  'StatusId' => int 2
  'PriorityId' => int 1
  'OrderId' => int 234567
  'CustomerId' => int 5
  'Initiated' => string '2016-03-02T01:11:12+00:00' (length=25)
  'Initiator' => int 2
  'FreePostageLabel' => boolean true
  'LostInPost' => boolean false
  'SuppressEmail' => boolean true
  'Type' => 
    array (size=4)
      'Id' => int 3
      'Title' => string 'title 3' (length=7)
      'Priority' => int 3
      'OrderReturns' => 
        array (size=1)
          0 => string '*RECURSION*' (length=11)
  'Status' => 
    array (size=6)
      'Id' => int 2
      'EmailId' => int 2
      'Title' => string 'title 2' (length=7)
      'Priority' => int 2
      'Email' => 
        array (size=5)
          'Id' => int 2
          'Subject' => string 'subject 2' (length=9)
          'Plaintext' => string 'plain text 2' (length=12)
          'Html' => string 'html 2' (length=6)
          'Statuses' => 
            array (size=1)
              0 => string '*RECURSION*' (length=11)
      'OrderReturns' => 
        array (size=1)
          0 => string '*RECURSION*' (length=11)
  'Priority' => 
    array (size=4)
      'Id' => int 1
      'Title' => string 'title 1' (length=7)
      'Priority' => int 1
      'OrderReturns' => 
        array (size=1)
          0 => string '*RECURSION*' (length=11)

现在,如果我修改原始代码以在转储之前更改值:

$object = $q->findPk(1);¬
$object->setStatusId(5);

生成的输出不包含Status元素,仅包含"StatusId"。在使用toArray()之前,我当然可以用$object->getStatus()将其恢复,但是有没有办法一般地做到这一点?

我想知道是否有办法检查值是否是外键,以便如果是,我可以在设置该值后自动获取getWhatevers(),而不是对它们进行硬编码。或者也许有更好的方法?

我的另一个选择是覆盖toArray但必须考虑错误的范围和此处数据库更改时的维护量。

调用 toArray 方法时,可以将第四个参数设置为 true,以使模型检索相关对象

$object->toArray(TableMap:: TYPE_PHPNAME, true, [], true);

编辑:正如@DarkBee注释中指出的那样,您已经使用正确的参数调用了toArray,那么为什么您没有在数组表示中获取相关对象呢?答案可能存在于代码的这一步中

$object->setStatusId(5)

您实际上是在不更新数据库相关记录的情况下更新对象,通过这样做 Propel 无法检索正确的相关对象,为了避免这种行为,您可以设置完整的 Status 对象而不是唯一的 id,例如:

$object->setStatus(StatusQuery::create()->findPk(5));

通过这样做,您将在数组表示形式中获得正确的 Status 对象信息,请注意,这(如前所述)可能不反映数据库状态。