У меня есть форма с этим полем:
class OrdersType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Others form fields
if ($options['curr_action'] !== NULL)
{
$builder
->add('status', 'entity', array(
'class' => 'CommonBundle:OrderStatus',
'property' => 'name',
'required' => TRUE,
'label' => FALSE,
'mapped' => FALSE
));
}
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(array(
'register_type'
));
$resolver->setOptional(array(
'curr_action'
));
$resolver->setDefaults(array(
'data_class' => 'Tanane\FrontendBundle\Entity\Orders',
'render_fieldset' => FALSE,
'show_legend' => FALSE,
'intention' => 'orders_form'
));
}
public function getName()
{
return 'orders';
}
}
И иметь эту сущность:
class OrderHasStatus {
use IdentifiedAutogeneratedEntityTrait;
/**
* Hook timestampable behavior
* updates createdAt, updatedAt fields
*/
use TimestampableEntity;
/**
* @ORM\ManyToOne(targetEntity="\Tanane\FrontendBundle\Entity\Orders")
* @ORM\JoinColumn(name="general_orders_id", referencedColumnName="id")
*/
protected $order;
/**
* @ORM\ManyToOne(targetEntity="\Tanane\CommonBundle\Entity\OrderStatus")
* @ORM\JoinColumn(name="status_id", referencedColumnName="id")
*/
protected $status;
public function setOrder(\Tanane\FrontendBundle\Entity\Orders $order)
{
$this->order = $order;
}
public function getOrder()
{
return $this->order;
}
public function setStatus(\Tanane\CommonBundle\Entity\OrderStatus $status)
{
$this->status = $status;
}
public function getStatus()
{
return $this->status;
}
}
Где я храню последний статус, присвоенный заказу. Мне нужно установить этот статус в форме, когда я редактирую или показываю заказ, но не знаю, как этого добиться, кто-нибудь может мне помочь?
Итак, это выглядит связано с Ваш другой вопрос, касающийся отношений n: m. Ваше существующее решение может работать, если у вас было отношение «многие ко многим», но не с тремя сущностями.
Я думаю, что решение похоже:
OrdersType
$builder->add('orderHasStatus', 'collection', array(
'type' => new OrderHasStatusType(),
'allow_add' => true,
'allow_delete' => true
));
OrderHasStatusType
$builder->add('status', 'collection', array(
'type' => new StatusType(),
'allow_add' => true,
'allow_delete' => true
));
StatusType
$builder->add('status', 'entity', array(
'class' => 'CommonBundle:Status'
));
Поскольку ваша схема стоит ^, ваш OrdersType должен содержать коллекцию типов OrderHasStatus, которые сами имеют StatusTypes, содержащие сами статусы.
^ Одна вещь, которую я хотел бы спросить, и, возможно, должен был бы иметь в моем другом ответе, является ли ваша схема правильной — вам нужен каждый Орден, чтобы иметь несколько Статусов? Если нет, то то, что вам действительно нужно, это «многие к одному» между порядком и статусом, который удалил бы промежуточный слой OrderHasStatus. Если вам нужны дополнительные данные о OrderHasStatus (отметка времени?), Вы можете поместить эту информацию в таблицу Order. Но если вам нужно несколько статусов или вы хотите хранить дополнительные данные отдельно от таблицы Orders (в этом случае Orders и OrderHasStatus на самом деле один-к-одному), это хорошо.
Других решений пока нет …