Symfony3 "SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'catId' cannot be null "



我正试图在DataFixtures类中使用ManyToOne关系保存数据。我在保存数据时遇到了这个错误。

请帮帮我。

来源:

实体/交易类别.php:

<?php
namespace AppBundleEntity;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineORMMapping as ORM;
/**
* DealsCategory
*
* @ORMTable(name="deals_category")
* @ORMEntity(repositoryClass="AppBundleRepositoryDealsCategoryRepository")
*/
class DealsCategory
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="alias", type="string", length=50, nullable=true)
*/
private $alias;
/**
* @ORMOneToMany(targetEntity="DealsCategoryLang", mappedBy="category")
*/
protected $categoryLang;
/**
* @return mixed
*/
public function getCategoryLang()
{
return $this->categoryLang;
}
/**
* @param DealsCategoryLang $categoryLang
*/
public function setCategoryLang(DealsCategoryLang $categoryLang = null)
{
$this->categoryLang = $categoryLang;
}
/**
* @param DealsCategoryLang $categoryLang
*/
public function setOneCategoryLang(DealsCategoryLang $categoryLang)
{
$this->categoryLang[] = $categoryLang;
}
/**
* DealsCategory constructor.
*/
public function __construct()
{
$this->categoryLang = new ArrayCollection();
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set alias
*
* @param string $alias
*
* @return DealsCategory
*/
public function setAlias($alias)
{
$this->alias = $alias;
return $this;
}
/**
* Get alias
*
* @return string
*/
public function getAlias()
{
return $this->alias;
}
}

实体/交易类别Lang.php:

<?php
namespace AppBundleEntity;
use DoctrineORMMapping as ORM;
/**
* DealsCategoryLang
*
* @ORMTable(name="deals_category_lang")
* @ORMEntity(repositoryClass="AppBundleRepositoryDealsCategoryLangRepository")
*/
class DealsCategoryLang
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
*
* @ORMColumn(name="catId", type="integer")
*/
private $catId;
/**
* @var string
*
* @ORMColumn(name="lang", type="string", length=10)
*/
private $lang;
/**
* @var string
*
* @ORMColumn(name="title", type="string", length=70)
*/
private $title;
/**
* @ORMManyToOne(targetEntity="DealsCategory", inversedBy="categoryLang", cascade={"persist"})
* @ORMJoinColumn(name="catId", referencedColumnName="id")
*
*/
protected $category;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set catId
*
* @param integer $catId
*
* @return DealsCategoryLang
*/
//    public function setCatId($catId)
//    {
//        $this->catId = $catId;
//
//        return $this;
//    }
/**
* Get catId
*
* @return int
*/
public function getCatId()
{
return $this->catId;
}
/**
* Set lang
*
* @param string $lang
*
* @return DealsCategoryLang
*/
public function setLang($lang)
{
$this->lang = $lang;
return $this;
}
/**
* Get lang
*
* @return string
*/
public function getLang()
{
return $this->lang;
}
/**
* Set title
*
* @param string $title
*
* @return DealsCategoryLang
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
}

DataFixtures/ORM/LoadCategories.php

<?php
namespace AppBundleDataFixturesORM;

use AppBundleEntityDealsCategory;
use AppBundleEntityDealsCategoryLang;
use DoctrineCommonDataFixturesFixtureInterface;
use DoctrineCommonPersistenceObjectManager;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentDependencyInjectionContainerAwareInterface;
use SymfonyComponentDependencyInjectionContainerInterface;
class LoadCategories implements FixtureInterface, ContainerAwareInterface
{
private $container;
/**
* Load data fixtures with the passed EntityManager
*
* @param ObjectManager $manager
*/
public function load(ObjectManager $manager)
{
$category = new DealsCategory();
$categoryLang = new DealsCategoryLang();
$categoryLang->setLang('en');
$categoryLang->setTitle('Food and Drinks');
$category->setOneCategoryLang($categoryLang);
$manager->persist($category);
$manager->persist($categoryLang);
$manager->flush();
}
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
}

我尝试过不同的方法,但仍然不起作用。请告诉我,我做错了什么?

UPD:我的错误是:

[DDoctrine\DBAL\Exception\NotNullConstraintViolationException]
使用params[null,"en","Food and Drinks"]执行"INSERT INTO deals_category_lang(catId,lang,title)VALUES(?,?,?)"时发生异常:
SQLSTATE[23000]:完整性约束冲突:1048列"catId"不能为null

[DDoctrine\DBAL\Driver\PDOException]
SQLSTATE[23000]:违反完整性约束:1048列"catId"不能为空

PDOException]
SQLSTATE[23000]:完整性约束冲突:1048列"catId"不能为空

我正在通过命令行运行固定装置:

php bin/console doctrine:fixtures:load --append 

好的,我解决了。。。问题出在我的Fixture类:

代替

$category->setOneCategoryLang($categoryLang);

我应该放

$categoryLang->setCategory($category);

,尊重我的实体关系的层次结构:(

最新更新