Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在数据库级别实现接口(Symfony3、ORM、SonataAdminBundle)?_Symfony_Oop_Doctrine Orm_Orm_Sonata Admin - Fatal编程技术网

如何在数据库级别实现接口(Symfony3、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

我用的是Symfony 3,Doctrine ORM和SonataAdminBundle

有一个任务,可以通过在代码级别实现一些接口来解决,但我不知道如何在数据库中正确存储这种结构的数据,并在管理面板中编辑这些数据

假设存在这样的初始条件

有一个“电影”主义实体。数据库中的表
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管理员


谢谢。

至于我,如果我正确理解你的问题,最好的解决办法就是使用


更多例子:,

至于我,如果我正确理解你的问题,最好的解决办法就是使用

更多示例: