用Propel更新对象后,我可以保持水合作用吗?

时间:2016-07-11 10:56:23

标签: php 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'。在使用$object->getStatus()之前,我当然可以使用toArray()将其恢复原状,但有没有办法一般地执行此操作?

我想知道是否有办法检查某个值是否为外键,如果是,我可以在设置该值后自动获取getWhatevers(),而不是硬编码。或者可能有更好的方法?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

$object->setStatusId(5)

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

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

通过执行此操作,您将在数组表示中获得正确的Status对象信息,请注意,这可能并不反映数据库状态。