我有两个表存储和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