2015-07-08 2 views
4

У меня проблема с правильной настройкой отображения Doctrine.Доктрина 2 многократная?

У меня есть CashRegister Объект, у которого есть место для мусора и место для возврата. Оба местоположения относятся к одному типу (BinLocation Entity).

исходящих из CashRegister, CashRegister->getBinLocations() и CashRegister->getReturnBinLocations() работает отлично, но как я могу добиться того, что BinLocation->getCashRegisters() возвращает все CashRegister сущностей, которые ссылаются (binLocation + returnBinLocation)?

/** 
* CashRegister 
* 
* @ORM\Table(name="cash_registers") 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class CashRegister 
{ 

    ... 

    /** 
    * @var BinLocation 
    * 
    * @ORM\ManyToOne(targetEntity="BinLocation", inversedBy="cashRegisters") 
    * @ORM\JoinColumn(name="bin_location_id", referencedColumnName="id") 
    */ 
    private $binLocation; 

    /** 
    * @var BinLocation 
    * 
    * @ORM\ManyToOne(targetEntity="BinLocation", inversedBy="cashRegisters") 
    * @ORM\JoinColumn(name="return_bin_location_id", referencedColumnName="id") 
    */ 
    private $returnBinLocation; 


    /** 
    * @return BinLocation 
    */ 
    public function getBinLocation() 
    { 
     return $this->binLocation; 
    } 

    /** 
    * @return BinLocation 
    */ 
    public function getReturnBinLocation() 
    { 
     return $this->returnBinLocation; 
    } 

    ... 

} 

/** 
* BinLocation 
* 
* @ORM\Table(name="bin_locations") 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class BinLocation 
{ 

    ... 

    /** 
    * @var CashRegister[] 
    * 
    * @ORM\OneToMany(targetEntity="CashRegister", mappedBy="binLocation") <= Here is the problem, in this case mappedBy need to be an array [binLocation, returnBinLocation] 
    */ 
    private $cashRegisters; 


    /** 
    * @return CashRegister[] 
    */ 
    public function getCashRegisters() 
    { 
     return $this->cashRegisters; 
    } 

    ... 

} 

ответ

4

Простой ответ заключается в том, что вы не можете. mappedBy принимает только один аргумент.

Решение для достижения того, что вы хотите, однако, прост. Создайте второе свойство в BinLocation под названием: cashRegisters2 следующим образом:

/** 
* @var CashRegister[] 
* 
* @ORM\OneToMany(targetEntity="CashRegister", mappedBy="binLocation") 
*/ 
private $cashRegisters; 

/** 
* @var CashRegister[] 
* 
* @ORM\OneToMany(targetEntity="CashRegister", mappedBy="binLocation") 
*/ 
private $cashRegisters2; 

Затем объединить коллекции в методе getCashRegisters.

/** 
* @return CashRegister[] 
*/ 
public function getCashRegisters() 
{ 
    return new ArrayCollection(
         array_merge($cashRegisters->toArray(), $cashRegisters2->toArray()) 
    ); 
} 

также изменить CashRegister отображения соответственно:

/** 
* @var BinLocation 
* 
* @ORM\ManyToOne(targetEntity="BinLocation", inversedBy="cashRegisters") 
* @ORM\JoinColumn(name="bin_location_id", referencedColumnName="id") 
*/ 
private $binLocation; 

/** 
* @var BinLocation 
* 
* @ORM\ManyToOne(targetEntity="BinLocation", inversedBy="cashRegisters2") 
* @ORM\JoinColumn(name="return_bin_location_id", referencedColumnName="id") 
*/ 
private $returnBinLocation; 

Примечание: я не проверял код. Этот пример относится только к серверу.

Примечание2: ArrayCollection слияние было вдохновлено здесь: https://stackoverflow.com/a/16871539/2853903

+1

Спасибо Марку за ваш ответ, но это решение выглядит как взломать. После долгого знакомства (до того, как я написал этот вопрос), я заметил, что только у немногих людей была та же проблема. Может быть, есть еще один способ реализовать его в более «доктрине»? (классы, таблицы, все может быть изменено, единственное требование состоит в том, что я могу сохранить местоположение бина и место для возврата в кассовый аппарат и вернуть их обратно) – ipsum

+0

Проблема возникает из-за того, что вы не можете указать несколько 'mappedBy 'полей. Таким образом, вам нужно решить проблему с помощью других функций, которые предлагает Doctrine, пример, предлагаемый выше. Если вы хотите, чтобы основные функциональные изменения Doctrine, возможно, попросили просить их в Github? На этом этапе, однако, все решения, которые вы получите, будут «хаки» :) – Mark

Смежные вопросы