文章和引用symfony之间的多对多关系

时间:2016-07-17 15:43:38

标签: php symfony orm doctrine-orm annotations

我在两个实体(产品和报价)之间存在import UIKit protocol SettingsSidebarViewDelegate{ func showTags(showTags: Bool); func showTimestamp(showTimeStamp: Bool) } var showTagsVal = false var showTimeStampVal = false class SettingsSidebarViewController: UIViewController { var delegate: SettingsSidebarViewDelegate! = nil @IBOutlet weak var sidebar_title: UILabel! @IBOutlet var showTagsSwitch: UISwitch! @IBOutlet var showTimestampSwitch: UISwitch! @IBAction func switchPressed(sender: AnyObject) { let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("main") as! MainTableViewController self.presentViewController(nextViewController, animated:true, completion:nil) let vc = MainTableViewController() self.delegate = vc if showTagsSwitch.on{ showTagsVal = true delegate.showTags(showTagsVal) } else{ showTagsVal = false delegate.showTags(showTagsVal) } if showTimestampSwitch.on{ showTimeStampVal = true delegate.showTimestamp(showTimeStampVal) } else{ showTimeStampVal = false delegate.showTimestamp(showTimeStampVal) } } override func viewDidLoad() { super.viewDidLoad() sidebar_title.text = "Settings" // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } 关系,以便一个或多个产品可以在一个或多个引号中。例如:

假设客户从特定企业中选择两种产品,并且他希望收到总结所有选定产品的报价。然后他决定选择另一家企业的另一种产品来获得另一个报价。所以这里我们有两个不同企业和同一用户的报价,每个报价都有自己的产品。 你会说这是报价和产品之间的manytomany关系,因为如上所述,一个报价可以有很多产品,所以在数据库中你会在产品表中有一个quote_id列。

但是,如果其他客户选择相同的产品,则会创建一个新的报价但是当查询通过填写产品表的quote_id列将这些产品插入报价中时,它会发现这些产品已经有了另一个引用的quote_id。

这就是为什么它是一个onetomany关系,以便许多文章可以在很多引号中。

这一部分已经实现,我可以将许多产品与许多引号匹配而没有任何问题。

这是引用的实体:

manytomany

实体文章:

    /**
     * @ORM\ManyToMany(targetEntity="ArticleBundle\Entity\Article", mappedBy="quotes")
     */
    private $articles;

    public function __construct() {
        $this->articles = new \Doctrine\Common\Collections\ArrayCollection();
        $this->createdAt = new \DateTime();
    }


    /**
     * Set articles
     *
     * @param \ArticleBundle\Entity\Article $articles
     * @return Quote
     */
    public function setArticles(\ArticleBundle\Entity\Article $articles = null) {
        $this->articles = $articles;

        return $this;
    }

    /**
     * Get articles
     *
     * @return \ArticleBundle\Entity\Article 
     */
    public function getArticles() {
        return $this->articles;
    }

    /**
     * Add articles
     *
     * @param \QuoteBundle\Entity\Quote$articles
     * @return Devis
     */
    public function addArticle(\ArticleBundle\Entity\Article $article) {       
        $article->addQuote($this); // synchronously updating inverse side
        $this->articles[] = $article;

        return $this;
    }

    /**
     * Remove articles
     *
     * @param \QuoteBundle\Entity\Quote $articles
     */
    public function removeArticle(\ArticleBundle\Entity\Article $article) {
        $this->articles->removeElement($article);
    }

}

}

我觉得难以达到的部分是,当顾客只选择一种产品时,我想让他指定所选产品的数量。

所以当我更新了学说模式时,我得到了这些表:

  • 引用表

  • 产品表

  • quotes_products table

任何人都可以告诉我在哪个表中我必须添加数量列,以及如何编写注释以使其自动添加到数据库中。我认为它会被添加到quotes_products表中。

感谢您帮助我。

1 个答案:

答案 0 :(得分:0)

将数量列添加到连接表时,您的关系将变得非常多。因此,将manyToMany关系分离为两个oneToMany关系没有问题,并为具有额外字段数量的连接创建实体类。

伪代码中的想法:

Class Quote
{

private $products;
/**
 * @ORM\OneToMany(targetEntity="Product", mappedBy="quote")
 */
}

<强>产品:

Class Product
{

private $quotes;
/**
 * @ORM\OneToMany(targetEntity="Quote", mappedBy="product")
 */
}

<强> ProdcutQuote:

Class ProductQuote
{
/**
 * @ORM\ManyToOne(targetEntity="Quote")
 * @ORM\JoinColumn(name="quote_id", referencedColumnName="id")
 */
private $quote;

/**
 * @ORM\ManyToOne(targetEntity="Product")
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
 */
private $product; 


private $quantity;
}