如果我像这样获取一个对象:
$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 对象信息,请注意,这(如前所述)可能不反映数据库状态。