Doctrine2 / PostgreSQL - Ошибка выбора с обнуляемым отношением

1

В моем приложении ZF2 у меня есть 2 объекта Doctrine2: Product and Partner

Поскольку в некоторых случаях продукт не нуждается в партнере, между товаром и партнером существует отношение NULL, связанное с ManyToOne.

Он работает, если партнер предоставлен в форме (выпадающий список). Но если нет, у меня есть эта ошибка:

An exception occurred while executing 'SELECT t0.id AS id1, t0.title AS title2 FROM partners t0 WHERE t0.id = ?' with params [""]:

SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for integer: ""'

Объекты:

/**
 * @ORM\Entity
 * @ORM\Table(name="products")
 */
class Product extends AbstractEntity
{
    /* ... */

    /**
     * @ORM\ManyToOne(targetEntity="Partner", inversedBy="products", cascade={"persist", "merge"})
     * @ORM\JoinColumn(name="partner_id", referencedColumnName="id", nullable=true)
     */
    protected $partner;

    /* ... */

    /**
     * @return Partner
     */
    public function getPartner()
    {
        return $this->partner;
    }

    /**
     * @param Partner $partner
     *
     * @return $this
     */
    public function setPartner(Partner $partner)
    {
        $this->partner = $partner;

        return $this;
    }

    /* ... */
}



/**
 * @ORM\Entity
 * @ORM\Table(name="partners")
 */
class Partner extends AbstractEntity
{
    /* ... */

    /**
     * @ORM\OneToMany(targetEntity="Product", mappedBy="partner", cascade={"persist", "merge", "remove"})
     **/
    protected $products;

    /* ... */

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }

    /* ... */

    /**
     * @param Product $product
     *
     * @return $this
     */
    public function addProduct(Product $product)
    {
        $this->products[] = $product;
        $product->setPartner($this);

        return $this;
    }

    /**
     * @param $products
     *
     * @return $this
     */
    public function addProducts($products)
    {
        foreach ($products as $product)
        {
            $this->addProduct($product);
        }

        return $this;
    }

    /**
     * @param null $products
     *
     * @return $this
     */
    public function removeProducts($products = null)
    {
        if (!$products)
        {
            $products = $this->getProducts();
        }

        foreach ($products as $product)
        {
            if (is_object($product))
            {
                $this->products->removeElement($product);
            }
            else $this->products->remove($product);
        }

        return $this;
    }

    /**
     * @return mixed
     */
    public function getProducts()
    {
        return $this->products;
    }

    /**
     * @param mixed $products
     *
     * @return $this
     */
    public function setProducts($products)
    {
        $this->products = $products;

        return $this;
    }

    /* ... */
}

Любая помощь приветствуется.

  • 0
    Вы добавили фильтр ToNull в свою форму? Потому что форма отправит пустой символ, и вы должны изменить это значение на ноль.
  • 0
    @hkulekci, нет, я не добавил
Показать ещё 4 комментария
Теги:
doctrine2
zend-framework2

2 ответа

1
Лучший ответ

Спасибо @hkulekci за ответ.

Я только что обновил свой фильтр ввода:

public function getInputFilterSpecification()
{
    return [
        'partner' => ['required' => true],
        /* ... */
    ];
}

К тому, что:

public function getInputFilterSpecification()
{
    return [
        'partner' => [
            'required' => true,
            'continue_if_empty' => true,
            'filters' => [
                ['name' => 'Null']
            ]
        ],
        /* ... */
    ];
}
0

Вам нужно будет разрешить null значение, которое будет передано setPartner методы

public function setPartner(Partner $partner = null)
{
    $this->partner = $partner;

    return $this;
}

Кроме того, в зависимости от вашего гидратора формы вам нужно убедиться, что если ни один партнер не выбран, пустое значение должно быть преобразовано в значение null.

  • 0
    Да, я тоже это попробовал. не работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню