如果我像这样获取一个对象:
$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
,但是必须考虑作为数据库更改的错误范围和维护量。
答案 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对象信息,请注意,这可能并不反映数据库状态。