Я нашел способ, который не совсем то, что я искал, но он не требует каких-либо изменений в моем приложении, так что все в порядке, пока я не найду лучшего решения.
Что я сделаю, так это сохраню фактический статус непосредственно в Ордене. Через LifecycleCallbacks я обновлю заказ, как только будет создан связанный с ним OrderStatus.
Итак, мой объект-ордер выглядит так:
/**
* @ORM\Entity
* @ORM\Table(name="_order")
*/
class Order{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
//..
/**
* @ORM\Column(type="smallint", nullable=false)
*/
protected $status = -1;
// Getter and Setter!
}
Мой статус заказа будет выглядеть следующим образом:
/**
* @ORM\Entity
* @ORM\Table(name="order_status")
* @ORM\HasLifecycleCallbacks
*/
class OrderStatus{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Order", inversedBy="order_status", cascade={"persist"})
* @ORM\JoinColumn(name="order_id", referencedColumnName="id", nullable=false)
*/
protected $order;
/**
* @ORM\Column(type="smallint", nullable=false)
*/
protected $statuscode;
// ..
/**
* @ORM\prePersist
*/
public function prePersist(){
$this->order->setStatus($this->statuscode);
}
// Getter and Setter!
}
Помните , cascade={"persist"}
внутри OrderStatus, чтобы Order также сохранялся при сохранении OrderStatus, в противном случае статус будет установлен, но не сохранен!
Плюсом этого решения является то, что теперь я получаю OrderStatus, вызывая $order->getStatus()
вместо необходимости запрашивать у базы данных статус и что я могу сделать $repository->findByStatus(0)
. С другой стороны, в случае изменения поля состояния из-за какой-либо ошибки данные будут несогласованными.
Как уже говорилось, если у вас есть решение, в котором мне не нужно дополнительное поле для хранения статуса, опубликуйте его! Я очень заинтересован в лучшем решении!