1

まず、私の英語で申し訳ありません。

私の注文エンティティ

* @ORM\Entity
* @ORM\Table(name="orders")
class Order implements InputFilterAwareInterface
{
    ...
    /**
     * Order status
     *
     * @ORM\OneToOne(targetEntity="Admin\Entity\OrdersStatus")
     * @ORM\JoinColumn(name="status_id", referencedColumnName="id")
     **/
    private $status;
    ...
}

My Order's Statues Entity

* @ORM\Entity
* @ORM\Table(name="orders_statuses")
class OrdersStatus implements InputFilterAwareInterface
{
    /**
     * @var Zend\InputFilter\InputFilter
     */
    protected $inputFilter;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;
}

私の注文フォーム

class OrderForm extends Form
{
    public function __construct(EntityManager $entityManager)
    {
        parent::__construct('Order');

        $this->setAttribute('method', 'post');
        $this->setAttribute('class', 'itemForm');

        $this->add(array(
            'name' => 'id',
            'attributes' => array(
                'type' => 'hidden',
            ),
        ));

        $this->add(array(
            'name'    => 'status',
            'type'    => 'DoctrineModule\Form\Element\ObjectSelect',
            'options' => array(
                'label' => 'Status',
                'object_manager' => $entityManager,
                'empty_option'   => '--- Select status ---',
                'target_class'   => 'Admin\Entity\OrdersStatus',
                'property'       => 'title'
            ),
            'attributes' => array(
                'required' => false
            )
        ));
    }
}

私の注文コントローラー

class OrderController extends AbstractActionController
{
...
public function editAction()
{
    $em = $this->getEntityManager();
    $id = (int) $this->getEvent()->getRouteMatch()->getParam('id');

    $item = new Stock\Entity\Order;

    if ($id) {
        $item = $em->getRepository($this->entity)->find($id);
    }

    $form = new Stock\Form\OrderForm($em);
    $form->setHydrator(new DoctrineEntity($em, Stock\Entity\Order, false));
    $form->bind($item);

    $request = $this->getRequest();
    if ($request->isPost()) {
        $post = $request->getPost();
        $form->setInputFilter($item->getInputFilter());
        $form->setData($post);

        if ($form->isValid()) {
            $em->persist($item);
            $em->flush();

            return $this->redirect()->toRoute('stock/order', array('action' => 'index'));
        }
    }
...
}

注文ステータスを選択せず​​にフォームを検証しようとすると、次のエラーが発生しました:「値は必須であり、空にすることはできません」。

この入力フィルターを使用している場合:

public function getInputFilter()
{
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();
        $factory     = new InputFactory();
        $inputFilter->add($factory->createInput(array(
            'name'     => 'client',
            'required' => false,
        )));

        $inputFilter->add($factory->createInput(array(
            'name'        => 'status',
            'allow_empty' => true,
            'required'    => false,
            'filters'     => array(
                array('name' => 'Null'),
            ),
        )));
    }
}

私はこれを得ました: Admin\Entity\OrdersStatus のクエリの識別子 ID がありません

Null フィルターなし:

「SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3 FROM orders_statuses t0 WHERE t0.id = ?」の実行中に例外が発生しました パラメータ付き [""]:

SQLSTATE[22P02]: 無効なテキスト表現: 7 エラー: 整数の無効な入力構文: ""

注文のステータスで空の値を許可する正しい方法は何ですか?

4

1 に答える 1