Symfony 3 - Добавить массив сущностей в базу данных из сущностей? - PullRequest
1 голос
/ 10 апреля 2019

Я хотел бы добавить поле типа массив в мою базу данных и иметь возможность использовать его, как и FOSUserBundle с ролями.

Цель состоит в том, чтобы добавить таблицу пакетов в мою сущность User.

Мне не нужна таблица соединений.

Я воспроизвел ту же схему, что и для ролей, и добавил все это в свою сущность пользователя

Некоторыекод моего объекта User.php:

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
/**
     * @var array
     * 
     * @ORM\Column(name="packages", type="array", length=255)
     */
    private $packages;


    public function addPackage($package)
    {
        if (!in_array($package, $this->packages, true)) {
            $this->packages[] = $package;
        }
    }

    /**
     * {@inheritdoc}
     * 
     * @return array
     */
    public function getPackages()
    {
        return $this->packages;
    }

    /**
     * {@inheritdoc}
     */
    public function setPackages(array $packages)
    {
        $this->packages = array();

        foreach ($packages as $package) {
            $this->addPackage($package);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function removePackage($package)
    {
        if (false !== $key = array_search(strtoupper($package), $this->packages, true)) {
            unset($this->packages[$key]);
            $this->packages = array_values($this->packages);
        }

        return $this;
    }

/**
 * Constructor
 */
public function __construct()
{
    parent::__construct();
    $this->packages = array();
}

В моей базе данных присутствует поле пакетов, и оно похоже на поле ролей.Но когда я соединяюсь с моим пользователем на сайте, у меня появляется эта ошибка:

Не удалось преобразовать значение базы данных "" в массив типа доктрины

Кто-то узнает, что не такс кодом?

Скриншот моей базы данных:

Структура базы данных Вид базы данных

1 Ответ

1 голос
/ 10 апреля 2019

Если вы не хотите устанавливать type = "string" в ваших пакетах $, вы можете сохранить "array" и выполнить эту команду sql, а также добавить nullable = true для других значений, которые у вас уже есть в вашем BD: Таким образом, пустые значения будут преобразованы в null.

 @ORM\Column(type="array", nullable=true)

и выполните команду sql:

ALTER TABLE my_table ADD my_new_column LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)'

или с помощью консоли Symfony:

php bin/console doctrine:query:sql "UPDATE <<your_table_name>> SET <<field_name>> = NULL WHERE <<field_name>>=''"
...