doctrine orm — рекурсивная функция для получения всех эквивалентных произведений с использованием переполнения стека

Я использую Symfony 3, и у меня есть таблица с отношением «многие ко многим».
One Piece имеет много эквивалентов.
Эквивалентная часть связана со многими частями.

Например :

куски : часть 1 | часть 2 | часть 3

эквиваленты: часть 4 | часть 1 | часть 4
часть 5

Я хочу получить все эквиваленты для части 1, результат должен быть: шт 4, шт 2, шт 3, шт 5

Вот код, который я пробовал, он дает просто: часть 4, часть 3

 public function findAllEquivalentsByReference($reference)
{
$pieceFinales = array();
$listFinal = array();

$pieceO =  $this->getEntityManager()
->createQuery(
'SELECT p FROM EKPlateformeBundle:Piece p '.
'where  p.reference = :ref   and  p.etat = true ')
->setParameter('ref',$reference)
->getResult();

if (empty($pieceO))
{
$pieceO =  $this->getEntityManager()
->createQuery(
'SELECT p FROM EKPlateformeBundle:Piece p '.
'INNER JOIN p.references_oem  r '.
'where (( r.reference = :ref ) OR ( p.reference = :ref  ) ) and
( p.etat = true )')
->setParameter('ref',$reference)
->getResult();
}foreach ($pieceO as $piece)
{
$equivalents = $piece->getEquivalents();
$initiaux = $piece->getPieceInitiale();

// Les equivalents :
foreach ($equivalents as $pe)
{
$autreEquivalents = $pe->getEquivalents();
array_push($listFinal, $pe);
foreach ($autreEquivalents as $p)
{
if (!in_array($p, $listFinal))
{
array_push($listFinal, $p);
$piece->addEquivalent($p);
}
}
}

//
foreach ($initiaux as $i)
{
$autreInitiaux = $i->getPieceInitiale();
array_push($listFinal, $i);
$piece->addEquivalent($i);
foreach ($autreInitiaux as $pii)
{
if (!in_array($pii, $listFinal))
{
array_push($listFinal, $pii);
$piece->addEquivalent($pii);
}
}
}
array_push($pieceFinales ,$piece);
}
return $pieceFinales ;
}

Я не мог найти рекурсивную функцию, чтобы дать правильный результат.

1

Решение

Для рекурсии у вас не может быть только 1 функции, вам нужно как минимум 2

Пример:

public function getEquivalentsByReference($reference)
{

$products = $someModel->getProductsByReference($reference);
$this->_getRecursiveEquivalents($products);
return $products;

}

protected function _getRecursiveEquivalents(&$products)
{
$equivalents = [];
foreach($products as $product) {
$equivalents[] = $someModel->getReferencesByID($product->reference);
}
$this->_getRecursiveEquivalents($equivalents);
$products = array_merge($products, $equivalents)}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector