Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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
Php symfony2/具有多个表的条令实体_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php symfony2/具有多个表的条令实体

Php symfony2/具有多个表的条令实体,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,如何映射和实现一个实体的setter/getter和注释,该实体在多个表中包含它的信息 例如,我们有以下表格: 产品(id、名称、ctime) 价格(id、价格) 已售出(id、金额) 购买(身份证、金额) 收入(id,收入) 市场份额(id,份额) 库存(id、金额) LastEdit(id,日期时间) 它们都是通过id联系起来的。 产品实体是这样的: class Product { private $id; private $name; private $pric

如何映射和实现一个实体的setter/getter和注释,该实体在多个表中包含它的信息

例如,我们有以下表格:

  • 产品(id、名称、ctime)
  • 价格(id、价格)
  • 已售出(id、金额)
  • 购买(身份证、金额)
  • 收入(id,收入)
  • 市场份额(id,份额)
  • 库存(id、金额)
  • LastEdit(id,日期时间)
它们都是通过id联系起来的。 产品实体是这样的:

class Product {
    private $id;
    private $name;
    private $price;
    private $sold;
    private $bought;
    private $revenue;
    private $share;
    private $stock;
    private $lastEdit;
}

感谢您

对于只有一个值的所有属性,您不必使用单独的表(实体)。为此,请使用简单属性(变量)和
app/console原则:generate:entities
将创建所有必需的getter和setter

如果您仍然需要(出于某种原因)将所有信息放在单独的表中,则在这种情况下,为所有属性(价格、销售额、收入等)创建实体,并配置OneToOne或OneToMany(取决于您希望该属性具有单值还是多值)产品与相关实体之间的链接

例如:

class Product {
  ...

  /**
   * @var \Doctrine\Common\Collections\ArrayCollection
   * @ORM\OneToMany(targetEntity="Price", mappedBy="product")
   */
  protected $prices;

  /**
   * @var Stock
   * @ORM\OneToOne(targetEntity="Stock", mappedBy="product")
   */
  protected $stock;
  ...
}
现在,具有OneToOne关系的股票实体:

class Stock {
  ...

  /**
   * @var integer
   * @ORM\Column(name="amount", type="integer")
   */
  protected $amount;

  /**
   * @var Product
   * @ORM\OneToOne(targetEntity="Product", inversedBy="stock")
   */
  protected $product;

  ...
}
class Price {
  ...

  /**
   * @var float
   * @ORM\Column(name="price", type="float")
   */
  protected $price;

  /**
   * @var Product
   * @ORM\ManyToOne(targetEntity="Product", inversedBy="prices")
   */
  protected $product;

  ...
}
和具有多个关系的价格实体:

class Stock {
  ...

  /**
   * @var integer
   * @ORM\Column(name="amount", type="integer")
   */
  protected $amount;

  /**
   * @var Product
   * @ORM\OneToOne(targetEntity="Product", inversedBy="stock")
   */
  protected $product;

  ...
}
class Price {
  ...

  /**
   * @var float
   * @ORM\Column(name="price", type="float")
   */
  protected $price;

  /**
   * @var Product
   * @ORM\ManyToOne(targetEntity="Product", inversedBy="prices")
   */
  protected $product;

  ...
}
正如我前面提到的
app/console原则:generate:entities
将根据配置创建所有必需的getter和setter

注意:请记住,使用此配置,具有OneTONE关系的子实体将使用附加字段-product_id进行更新。OneToMany不会改变您的模式

希望有帮助


干杯

非常感谢,这确实很有帮助。在这种方法中,条令是否会对获取信息进行过多的查询?第二个问题:如果我持久化一个没有价格的对象,它会在价格表中创建一个空行吗?因为产品中的prices属性是OneToMany关系,当您使用空的
prices
list保存产品时,数据库中不会创建任何内容。另一方面,如果选择为其他实体(属性)创建OneTONE关系,则必须在构造函数中手动或使用级联创建它们。如果您不这样做,那么访问这些属性将引发异常。稍后将通过对数据库的附加查询来访问它们。如果您不希望这样,那么按照我前面的建议使用常规属性(列)。