我可以在使用 Propel 更新对象后保持水合作用吗?
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 对象信息,请注意这(如前所述)可能不会反映数据库状态。
如果我像这样获取一个对象:
$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 对象信息,请注意这(如前所述)可能不会反映数据库状态。