У меня довольно простой запрос:
TableAQuery :: Create () -> leftJoinWith ( ‘TableB’) -> Поиск () -> ToArray ()
Проблема заключается в том, что TableB возвращает обратную ссылку для всех кортежей в tableA, которые имеют одинаковую ссылку на tableB.
то есть притворяться, что первые 4 из 5 кортежей в таблице A ссылаются на один и тот же кортеж в таблице B, в результате каждый кортеж в таблице B также содержит те же 4 ссылки обратно на tableA:
TableA_Array: Array[5]
0:Object
id: 0
tableB_id: 4
TableB:Object
id: 4
TableAs: Object
TableA_0: "*RECURSION*"TableA_1: Object
TableA_2: Object
TableA_3: Object
1:Object
id: 1
tableB_id: 4
TableB:Object
id: 4
TableAs: Object
TableA_0: Object
TableA_1: "*RECURSION*"TableA_2: Object
TableA_3: Object
2:Object
id: 2
tableB_id: 4
TableB:Object
id: 4
TableAs: Object
TableA_0: Object
TableA_1: Object
TableA_2: "*RECURSION*"TableA_3: Object
3:Object
id: 3
tableB_id: 4
TableB:Object
id: 4
TableAs: Object
TableA_0: Object
TableA_1: Object
TableA_2: Object
TableA_3: "*RECURSION*"4:Object
id: 4
tableB_id: 77
TableB:Object
id: 77
TableAs: Object
TableA_0: "*RECURSION*"
Вот схема, если вам интересно:
<table name="tablea" phpName="TableA">
<column name="id" type="integer" reqiured="true" primaryKey="true" />
<column name="tableB_id" type="integer" reqiured="true"/>
<foreign-key foreignTable="tableb">
<reference local="tableB_id" foreign="id" />
</foreign-key>
</table>
<table name="tableb" phpName="TableB">
<column name="id" type="integer" reqiured="true" primaryKey="true" />
</table>
В больших запросах результатом является огромный экспоненциальный рост, который замедляет всю систему. Как можно избежать ссылок на TableA из TableB, не удаляя ссылку на внешний ключ в схеме?
Попробуйте добавить ->setFormatter('Propel\Runtime\Formatter\OnDemandFormatter')
как раз перед ->find()
а затем место ->toArray()
внутри вашей петли
Это будет загружать каждый объект только по мере необходимости, а не все сразу
Других решений пока нет …