如何在数据库级别实现接口(Symfony3、ORM、SonataAdminBundle)?
我用的是Symfony 3,Doctrine ORM和SonataAdminBundle 有一个任务,可以通过在代码级别实现一些接口来解决,但我不知道如何在数据库中正确存储这种结构的数据,并在管理面板中编辑这些数据 假设存在这样的初始条件 有一个“电影”主义实体。数据库中的表如何在数据库级别实现接口(Symfony3、ORM、SonataAdminBundle)?,symfony,oop,doctrine-orm,orm,sonata-admin,Symfony,Oop,Doctrine Orm,Orm,Sonata Admin,我用的是Symfony 3,Doctrine ORM和SonataAdminBundle 有一个任务,可以通过在代码级别实现一些接口来解决,但我不知道如何在数据库中正确存储这种结构的数据,并在管理面板中编辑这些数据 假设存在这样的初始条件 有一个“电影”主义实体。数据库中的表film /** * @ORM\Table(name="film") * @ORM\Entity */ class Film { /** * @var int * * @ORM\C
film
/**
* @ORM\Table(name="film")
* @ORM\Entity
*/
class Film
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
存在一个“用户”原则实体。数据库中的表user
/**
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="cinema")
* @ORM\Entity
*/
class Cinema
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Town
*
* @ORM\ManyToOne(targetEntity="Town")
* @ORM\JoinColumn(name="town_id", referencedColumnName="id", nullable=false)
*/
private $town;
/**
* @return Town
*/
public function getTown()
{
return $this->town;
}
...
}
/**
* @ORM\Table(name="town")
* @ORM\Entity
*/
class Town
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="view")
* @ORM\Entity
*/
class View
{
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
private $user;
/**
* @var Film
*
* @ORM\ManyToOne(targetEntity="Film")
* @ORM\JoinColumn(name="film_id", referencedColumnName="id", nullable=false)
*/
private $film;
/**
* @var Cinema
*
* @ORM\ManyToOne(targetEntity="Cinema")
* @ORM\JoinColumn(name="cinema_id", referencedColumnName="id", nullable=false)
*/
private $cinema;
/**
* @return Cinema
*/
public function getCinema()
{
return $this->cinema;
}
...
}
有一个“电影”主义实体。数据库中的表cinema
/**
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="cinema")
* @ORM\Entity
*/
class Cinema
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Town
*
* @ORM\ManyToOne(targetEntity="Town")
* @ORM\JoinColumn(name="town_id", referencedColumnName="id", nullable=false)
*/
private $town;
/**
* @return Town
*/
public function getTown()
{
return $this->town;
}
...
}
/**
* @ORM\Table(name="town")
* @ORM\Entity
*/
class Town
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="view")
* @ORM\Entity
*/
class View
{
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
private $user;
/**
* @var Film
*
* @ORM\ManyToOne(targetEntity="Film")
* @ORM\JoinColumn(name="film_id", referencedColumnName="id", nullable=false)
*/
private $film;
/**
* @var Cinema
*
* @ORM\ManyToOne(targetEntity="Cinema")
* @ORM\JoinColumn(name="cinema_id", referencedColumnName="id", nullable=false)
*/
private $cinema;
/**
* @return Cinema
*/
public function getCinema()
{
return $this->cinema;
}
...
}
正如我们所看到的,“电影院”有一个“城镇”字段,它决定电影院位于哪个城镇。因此,还有一个“城镇”主义实体。数据库中的表town
/**
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="cinema")
* @ORM\Entity
*/
class Cinema
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Town
*
* @ORM\ManyToOne(targetEntity="Town")
* @ORM\JoinColumn(name="town_id", referencedColumnName="id", nullable=false)
*/
private $town;
/**
* @return Town
*/
public function getTown()
{
return $this->town;
}
...
}
/**
* @ORM\Table(name="town")
* @ORM\Entity
*/
class Town
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="view")
* @ORM\Entity
*/
class View
{
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
private $user;
/**
* @var Film
*
* @ORM\ManyToOne(targetEntity="Film")
* @ORM\JoinColumn(name="film_id", referencedColumnName="id", nullable=false)
*/
private $film;
/**
* @var Cinema
*
* @ORM\ManyToOne(targetEntity="Cinema")
* @ORM\JoinColumn(name="cinema_id", referencedColumnName="id", nullable=false)
*/
private $cinema;
/**
* @return Cinema
*/
public function getCinema()
{
return $this->cinema;
}
...
}
接下来,有必要从这些数据创建一个“视图日志”,即将每个视图的数据存储在实体“视图”中(与MVC视图无关)。数据库中的表视图
/**
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="cinema")
* @ORM\Entity
*/
class Cinema
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Town
*
* @ORM\ManyToOne(targetEntity="Town")
* @ORM\JoinColumn(name="town_id", referencedColumnName="id", nullable=false)
*/
private $town;
/**
* @return Town
*/
public function getTown()
{
return $this->town;
}
...
}
/**
* @ORM\Table(name="town")
* @ORM\Entity
*/
class Town
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
/**
* @ORM\Table(name="view")
* @ORM\Entity
*/
class View
{
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
private $user;
/**
* @var Film
*
* @ORM\ManyToOne(targetEntity="Film")
* @ORM\JoinColumn(name="film_id", referencedColumnName="id", nullable=false)
*/
private $film;
/**
* @var Cinema
*
* @ORM\ManyToOne(targetEntity="Cinema")
* @ORM\JoinColumn(name="cinema_id", referencedColumnName="id", nullable=false)
*/
private $cinema;
/**
* @return Cinema
*/
public function getCinema()
{
return $this->cinema;
}
...
}
一个相当简单的方案
假设在我们的业务逻辑中,这是非常重要的,用户在哪个城镇观看了电影。要找到一个城镇,我们可以这样做:$view->getCinema()->getTown(),并获取所需的“town”对象
但突然发现,用户不仅可以在电影院观看电影,还可以:
-在电视上;
-通过计算机
在代码级别,解决方案似乎非常简单:声明具有getTown()方法的“ViewPlaceInterface”,并在“Cinema”、“TV”、“Computer”类中实现该接口
这允许我们调用$view->getViewPlace()->getTown()并获取“Town”对象
我的问题是:如何在Symfony 3、ORM、SonataAdminBundle中实现这一点?应该创建哪些表和实体?应如何配置原则ORM?如何配置sonata管理员
谢谢。至于我,如果我正确理解你的问题,最好的解决办法就是使用
更多例子:,至于我,如果我正确理解你的问题,最好的解决办法就是使用 更多示例: