0

我正在编写一个程序来跟踪客户可以订购的帆。我的程序具有以下类结构:

Sail
    - mainsail
    - jib
    - spinnaker

我不确定是否使用 mappedsuperclass 或其他一些学说继承类型来维护程序中的以下类型的关系:

Mainsail extends Sail

我希望数据库本身(mySQL)分别有一个主帆、三角帆和三角帆表。

到目前为止,我的 Co/QuoteBundle/Entity 文件夹中只有一个 Mainsail 实体/类:

namespace Co\QuoteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Mainsail
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Co\QuoteBundle\Entity\MainsailRepository")
 */
class Mainsail
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;

    /**
     * @var integer
     *
     * @ORM\ManyToOne(targetEntity="Boat", inversedBy="mainsails")
     * @ORM\JoinColumn(name="boat_id", referencedColumnName="id")
     * @Assert\NotBlank()
     */
    private $boatType;

    /**
     * @var float
     *
     * @ORM\Column(name="build_price", type="decimal")
     */
    private $buildPrice;

    //other variables, plus doctrine-generated getters and setters
}

最终,我的目标是不必为所有帆类复制相同的函数,这样我就可以将一个帆数组发送到 twig 中,并在适用的情况下将它们全部视为相同类型或不同类型。

{% for sail in sails %}
    <p>{{sail.name}} (${{sail.buildPrice}})</p>
{% endfor %}

谢谢!

4

2 回答 2

0

如果您希望每个表共享公共属性,那么 class-table-inheritance 是您的最佳选择:http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#类表继承

这实际上取决于不同类型的帆之间有多少差异。如果它只是几个属性,那么单表继承会更快并且可能适合您的需求。仔细阅读关于继承的章节。

于 2013-04-25T12:13:00.327 回答
0

根据@Cerad 的回答,我想出了以下数据库模式:

sail {id (int), boat_id (int), discr (varchar), options (bool)}
mainsail {id (int), name (varchar), build_price (decimal), weight_lbs (decimal)}
jib {id (int), name (varchar), build_price (decimal), weight_lbs (decimal)}
spinnaker {id (int), name (varchar), build_price (decimal), weight_lbs (decimal)}

这是通过运行生成的

$php app/console doctrine:generate:entities {packagename}
$php app/console doctrine:schema:update --force

关闭以下代码:

(学说从注释中生成 discr 列)

帆类:

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="Co\QuoteBundle\Entity\SailRepository")
 * @ORM\Table(name="sail")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"main" = "Mainsail", "jib" = "Jib", "genoa" = "Genoa", "spinnaker" = "Spinnaker"})
 */
class Sail {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;    

/**
 * @var integer
 *
 * @ORM\ManyToOne(targetEntity="Boat", inversedBy="sails")
 * @ORM\JoinColumn(name="boat_id", referencedColumnName="id", nullable=false)
 * @Assert\NotBlank()
 */
private $boatType;

/**
 * @var boolean
 *
 * @ORM\Column(name="options", type="boolean")
 */
private $hasOptions;

/**
* @ORM\OneToMany(targetEntity="SailOption", mappedBy="owningSail")
*/
private $optionChoices;

//setters and getters generated by doctrine

主帆类(三角帆和大三角帆是相同的):

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Mainsail
 *
 * @ORM\Table(name="mainsail")
 * @ORM\Entity(repositoryClass="Co\QuoteBundle\Entity\MainsailRepository")
 */
class Mainsail extends Sail {


/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=100)
 */
private $name;

/**
 * @var string
 *
 * @ORM\Column(name="descr", type="string", length=255, nullable=true)
 */
private $descr;

/**
 * @var float
 *
 * @ORM\Column(name="build_price", type="decimal", precision=7, scale=2)
 */
private $buildPrice;

/**
 * @var float
 *
 * @ORM\Column(name="weight_lbs", type="decimal", precision=4, scale=1)
 */
private $weightLbs;

//getters and setters generated by doctrine

是的,name、build_price 和 weight 变量中存在冗余。我将它们放在单独的表格中,因为我觉得这是一种更好的方法,可以在未来开发简单的 CMS 以单独添加/删除帆。由于我还没有解决这个问题,而且我对此还比较陌生,所以我不确定是否会这样。评论表示赞赏:)

谢谢。

于 2013-05-09T18:23:13.983 回答