完整性约束冲突:1048 列"gameHallID"在 Symfony 一对多关系中不能为空



我有两个表存储和store_timings,我想在其中保存从星期一到星期日的存储时间。我创建了两个实体商店.php和Store_timings.php

商店.php

namespace TestBotBundleEntity;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineORMMapping as ORM;
/**
* Store
*
* @ORMTable(name="store", indexes={@ORMIndex(name="idxReference", 
columns={"reference"}), @ORMIndex(name="idxLounges", columns={"name", 
"province", "loungePage"})})
* @ORMEntity
*/
class Store
{
/**
 * @var integer
 *
 * @ORMColumn(name="storeID", type="integer", nullable=false)
 * @ORMId
 * @ORMGeneratedValue(strategy="IDENTITY")
 */
private $storeID;
/**
 * @var string
 *
 * @ORMColumn(name="name", type="string", length=50, nullable=true)
 */
private $name;
/**
 * @var string
 *
 * @ORMColumn(name="openinghours", type="blob", length=65535, nullable=true)
 */
private $openinghours;
/**
 * @var string
 *
 * @ORMColumn(name="document", type="blob", length=65535, nullable=true)
 */
private $document;
/**
 * @var ArrayCollection
 * @ORMOneToMany(targetEntity="TestBotBundleEntityStoreTimings",mappedBy="gameHallOpeningHours",cascade={"persist"})
 */
private $gameHallOpeningHours;
/**
 * @var DateTime
 *
 * @ORMColumn(name="addedTs", type="datetime", nullable=true)
 */
private $addedts;
/**
 * Store constructor.
 */
public function __construct()
{
    $this->gameHallOpeningHours = new ArrayCollection();
}
/**
 * @return int
 */
public function getStoreId()
{
    return $this->storeID;
}
/**
 * @param Store $storeId
 */
public function setStoreId(Store $storeId)
{
    $this->storeId = $storeId;
}
/**
 * @return string
 */
public function getName()
{
    return $this->name;
}
/**
 * @param string $name
 */
public function setName($name)
{
    $this->name = $name;
}
/**
 * @return string
 */
public function getOpeninghours()
{
    return $this->openinghours;
}
/**
 * @param string $openinghours
 */
public function setOpeninghours($openinghours)
{
    $this->openinghours = $openinghours;
}
/**
 * @return string
 */
public function getDocument()
{
    return $this->document;
}
/**
 * @param string $document
 */
public function setDocument($document)
{
    $this->document = $document;
}
/**
 * @return DateTime
 */
public function getAddedts()
{
    return $this->addedts;
}
/**
 * @param DateTime $addedts
 */
public function setAddedts($addedts)
{
    $this->addedts = $addedts;
}

/**
 * @return ArrayCollection | Store
 */
public function getGameHallOpeningHours()
{
    return $this->gameHallOpeningHours;
}
/**
 * @param array $gameHallOpeningHours
 */
public function setGameHallOpeningHours(array $gameHallOpeningHours)
{
    $this->gameHallOpeningHours = $gameHallOpeningHours;
}

}

商店计时.php

namespace TestBotBundleEntity;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineORMMapping as ORM;
/**
 * StoreTimings
 *
 * @ORMTable(name="store_timings")
 */
class StoreTimings
{ 
/**
 * @var integer
 *
 * @ORMColumn(name="id", type="integer", nullable=false)
 * @ORMId
 * @ORMGeneratedValue(strategy="IDENTITY")
 */
 private $id;
/**
 *
 * @ORMManyToOne(targetEntity="store",cascade={"persist"})
 * @ORMJoinColumn(name="gameHallID", referencedColumnName="storeID")
 */
private $gameHallID;
/**
 * @var string
 *
 * @ORMColumn(name="day", type="string", length=11, nullable=true)
 */
private $day;
/**
 * @var string
 *
 * @ORMColumn(name="opening_hours", type="string", length=11, nullable=true)
 */
private $openingHours;
/**
 * @var string
 *
 * @ORMColumn(name="closing_hours", type="string", length=11, nullable=true)
 */
private $closingHours;
/**
 * @return int
 */
public function getId()
{
    return $this->id;
}
/**
 * @param int $id
 */
public function setId($id)
{
    $this->id = $id;
}
/**
 * @return int
 */
public function getGameHallID()
{
    return $this->gameHallID;
}
/**
 * @param int $gamehallid
 */
public function setGamehallid($gamehallid)
{
    $this->gameHallID = $gamehallid;
}
/**
 * @return string
 */
public function getDay()
{
    return $this->day;
}
/**
 * @param string $day
 */
public function setDay($day)
{
    $this->day = $day;
}
/**
 * @return string
 */
public function getOpeningHours()
{
    return $this->openingHours;
}
/**
 * @param string $openingHours
 */
public function setOpeningHours($openingHours)
{
    $this->openingHours = $openingHours;
}
/**
 * @return string
 */
public function getClosingHours()
{
    return $this->closingHours;
}
/**
 * @param string $closingHours
 */
public function setClosingHours($closingHours)
{
    $this->closingHours = $closingHours;
}
}

能够生成包含来自两个实体的字段的表单,但在保存时,我得到了完整性违规。

我做了太多的SO/谷歌搜索了很多。我也是Symfony的新手。

此外,当我尝试在保存到数据库之前打印时,我得到以下对象

TestBotBundleEntityStore Object
(
[storeID:TestBotBundleEntityStore:private] => 
[name:TestBotBundleEntityStore:private] => ergeg
[address:TestBotBundleEntityStore:private] => Rege
[zip:TestBotBundleEntityStore:private] => rger
[city:TestBotBundleEntityStore:private] => erg
[province:TestBotBundleEntityStore:private] => gerg
[phone:TestBotBundleEntityStore:private] => rg
[reference:TestBotBundleEntityStore:private] => 
[email:TestBotBundleEntityStore:private] => 
[coords:TestBotBundleEntityStore:private] => 
[loungepage:TestBotBundleEntityStore:private] => 1
[hasvouchers:TestBotBundleEntityStore:private] => 1
[cashoutallowed:TestBotBundleEntityStore:private] => 1
[hasparking:TestBotBundleEntityStore:private] => 1
[hashotkeys:TestBotBundleEntityStore:private] => 1
[openinghours:TestBotBundleEntityStore:private] => 
[document:TestBotBundleEntityStore:private] => 
[gameHallOpeningHours:TestBotBundleEntityStore:private] => Array
    (
        [0] => TestBotBundleEntityStoreTimings Object
            (
                [id:TestBotBundleEntityStoreTimings:private] => 
                [gameHallID:TestBotBundleEntityStoreTimings:private] 
=> 
                [day:TestBotBundleEntityStoreTimings:private] => 1
                [openingHours:TestBotBundleEntityStoreTimings:private] => 
                [closingHours:TestBotBundleEntityStoreTimings:private] => 
            )
    )
    [addedts:TestBotBundleEntityStore:private] => 
)

商店类型.php

  public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('address')
        ->add('zip')
        ->add('city')
        ->add('province')
        ->add('phone')
        ->add('loungepage')
        ->add('hasvouchers')
        ->add('cashoutallowed')
        ->add('hasparking')
        ->add('hashotkeys')
    ;
       $builder->add('store_id','collection',[
            'type' => 'store_timings',
            'property_path' => 'game_hall_opening_hours',
            'allow_add'    => true,
        ]); 

}
/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Store::class,
    ));
}

商店计时类型.php

class StoreTimingsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('day','choice',[
            'choices' => [
                1=>'Monday',
                2=>'Tuesday',
                3=>'Wednesday',
                4=>'Thursday',
                5=>'Friday',
                6=>'Saturday',
                7=>'Sunday'],
        ])
        ->add('opening_hours')
        ->add('closingHours');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults([
        'data_class' => StoreTimings::class,
    ]);
}

表单中,您需要为表单构建器中的gameHallID添加这样的关系

->add('brand', EntityType::class, array(
        // query choices from this entity
        'class' => 'YourBundle:YourClass',
    ))

或者你可以在字段中进行如下nullable=true

@ORMJoinColumn(name="gameHallID", referencedColumnName="storeID", nullable=true)

可能是我无法正确解释这个问题。但我不知何故通过实验发现以下解决方案有效:

/**
* @param array $gameHallOpeningHours 
*/
public function setGameHallOpeningHours(array $gameHallOpeningHours)
{
  foreach($gameHallOpeningHours as $timeSlots){
   $timeSlots->setGameHall($this);
   }
   $this->gameHallOpeningHours = $gameHallOpeningHours;
 }

** GameHall 是 StoreTiming 中的一个私有变量.php

最新更新