【问题标题】:Symfony 3 - Add an array entities to the database from entity?Symfony 3 - 从实体向数据库添加数组实体?
【发布时间】:2019-08-31 21:07:08
【问题描述】:

我想在我的数据库中添加一个数组类型的字段,并且能够使用它,就像 FOSUserBundle 和角色一样。

目标是向我的用户实体添加一个包表。

我不想要一个连接表。

我复制了与角色相同的架构,并将所有这些添加到我的用户实体中

我的 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();
}

在我的数据库中,存在 packages 字段,并且似乎类似于角色字段。但是当我在网站上与我的用户联系时,我遇到了这个错误:

无法将数据库值 "" 转换为 Doctrine Type 数组

有人会知道代码有什么问题吗?

我的数据库截图:

Database structure Database view

【问题讨论】:

  • 您要保存的阵列有多大。数据库中的列是什么类型和长度?数组类型将数组转换为字符串表示,所以插入数据库时​​可能会丢失数据?
  • 我的数组的长度似乎是 255。类型:longtext。一切都像角色一样。我编辑我的帖子添加 2 个屏幕截图给你看
  • 就个人而言,我会尝试将 DB 列类型更改为 TEXT,看看会发生什么。
  • 是的,我也是这么想的,我试过了,但是这样做,当我尝试向我的包属性添加一些东西时出现错误:警告:in_array() 期望参数 2 是数组,字符串给定
  • 我编辑了我的评论说数据库列类型,而不是教义类型。

标签: php arrays symfony collections roles


【解决方案1】:

如果您不想在 $packages 中设置 type="string",则可以保留“array”并执行此 sql 命令,并为 BD 中已有的其他值添加 nullable=true : 像这样,空值会被转为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>>=''"

【讨论】:

  • 不错!!很高兴为您提供帮助!
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 2013-12-26
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多