0

顧客が注文できる帆を追跡するプログラムを書いています。私のプログラムには、次のクラス構造があります。

Sail
    - mainsail
    - jib
    - spinnaker

プログラム内で次のタイプの関係を維持するために、マップされたスーパークラスまたは他のドクトリン継承タイプを使用するかどうかはわかりません。

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

@Cerad の回答に基づいて、次の DB スキーマを思いつきました。

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 に答える
0

それぞれ共通の属性を共有する個々のテーブルが必要な場合は、class-table-inheritance が最良の選択です: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#クラステーブルの継承

それは、さまざまなタイプの帆の間にどれだけの違いがあるかによって異なります. いくつかの属性だけの場合は、単一テーブルの継承の方が高速であり、ニーズに合う可能性があります。継承に関する章を注意深く読んでください。

于 2013-04-25T12:13:00.327 に答える