Doctrine2 / MySQL - 在多列上创建一个自动递增字段
Doctrine2 / MySQL - Create an auto increment field on multiple columns
我想知道是否可以有一个基于多列的自动递增字段?
这是我的问题:
我有一个 table,它将 CARTS 存储在 LINES 中。我为每个购物车都有一个唯一的 ID,但我也想为每一行生成一个唯一的 ID。所以我可以在一行中有一个唯一的 CART ID。
实际上,我想完全按照 MySQL 文档中的示例进行操作:
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
id 在 grp 列内递增。
我对主键/索引有点迷茫,我不知道是否必须使用它们来生成我的 ID。
我试图将其添加到我的 symfony 实体中,但它没有生成具有我想要的 ID 的新列。
* @ORM\Table(indexes={@ORM\Index(name="line_idx", columns={"line_id"})})
我认为这可能是您想要做的:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Animal
* @package AppBundle\Entity
*
* @ORM\Table(name="animals")
* @ORM\Entity
*/
class Animal
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(name="grp", type="string", length=255, nullable=false)
*/
private $grp;
/**
* @var integer
*
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\Column(name="id", type="integer", nullable=false)
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
}
基本上,您使用 @Id
注释标记属性 id
和 grp
,以便它们都将成为主键的一部分。然后你只用 @GeneratedValue
注释标记 id
以使其自动递增。
请确保您使用的是 MyISAM,因为看起来 InnoDB.
不支持此功能
注意: @GeneratedValue
注释必须始终是属性标志的一部分,如 @Id
如 official documentation 中所述。
好吧,我设法做了我想做的事,我不确定这是否是最好的方法,但我是这样做的:
我添加了 cart_id 字段:
/**
* @var integer
*
* @ORM\Column(name="cart_id", type="integer", nullable=false)
*/
private $cart_id;
然后,我添加了一个唯一约束,以确保所有内容都是唯一的:
* @ORM\Table(uniqueConstraints={@UniqueConstraint(name="cart_idx", columns={"line_id", "cart_id"})})
然后,我创建了一个存储库函数来获取给定行的最后一个 cart_id(我的购物车和我的行之间存在 ManyToOne 关系:
<?php
namespace CM\PlatformBundle\Entity;
use Doctrine\ORM\EntityRepository;
/**
* CartRepository
*/
class CartRepository extends EntityRepository
{
public function getLastCartIdForLine($lineId) {
return $this->createQueryBuilder('c')
->select('c.cart_id')
->join('c.line','l')
->andWhere('l.id = :lineId')
->setParameter('lineId', $lineId)
->orderBy('c.id', 'DESC')
->setMaxResults(1)
->getQuery()
->getSingleScalarResult();
}
}
我终于做到了:
$cart = new Cart;
$lastCartId = $em->getRepository('CMPlatformBundle:Cart')->getLastCartIdForLine($lineId);
$cart->setCartId($lastCartId+1);
$em->persist($cart);
有效,但不确定这是否是处理此问题的最佳方式。如果您找到更好的东西,请告诉我。
我想知道是否可以有一个基于多列的自动递增字段?
这是我的问题: 我有一个 table,它将 CARTS 存储在 LINES 中。我为每个购物车都有一个唯一的 ID,但我也想为每一行生成一个唯一的 ID。所以我可以在一行中有一个唯一的 CART ID。
实际上,我想完全按照 MySQL 文档中的示例进行操作:
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
id 在 grp 列内递增。
我对主键/索引有点迷茫,我不知道是否必须使用它们来生成我的 ID。
我试图将其添加到我的 symfony 实体中,但它没有生成具有我想要的 ID 的新列。
* @ORM\Table(indexes={@ORM\Index(name="line_idx", columns={"line_id"})})
我认为这可能是您想要做的:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Animal
* @package AppBundle\Entity
*
* @ORM\Table(name="animals")
* @ORM\Entity
*/
class Animal
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(name="grp", type="string", length=255, nullable=false)
*/
private $grp;
/**
* @var integer
*
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\Column(name="id", type="integer", nullable=false)
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
}
基本上,您使用 @Id
注释标记属性 id
和 grp
,以便它们都将成为主键的一部分。然后你只用 @GeneratedValue
注释标记 id
以使其自动递增。
请确保您使用的是 MyISAM,因为看起来 InnoDB.
不支持此功能注意: @GeneratedValue
注释必须始终是属性标志的一部分,如 @Id
如 official documentation 中所述。
好吧,我设法做了我想做的事,我不确定这是否是最好的方法,但我是这样做的:
我添加了 cart_id 字段:
/**
* @var integer
*
* @ORM\Column(name="cart_id", type="integer", nullable=false)
*/
private $cart_id;
然后,我添加了一个唯一约束,以确保所有内容都是唯一的:
* @ORM\Table(uniqueConstraints={@UniqueConstraint(name="cart_idx", columns={"line_id", "cart_id"})})
然后,我创建了一个存储库函数来获取给定行的最后一个 cart_id(我的购物车和我的行之间存在 ManyToOne 关系:
<?php
namespace CM\PlatformBundle\Entity;
use Doctrine\ORM\EntityRepository;
/**
* CartRepository
*/
class CartRepository extends EntityRepository
{
public function getLastCartIdForLine($lineId) {
return $this->createQueryBuilder('c')
->select('c.cart_id')
->join('c.line','l')
->andWhere('l.id = :lineId')
->setParameter('lineId', $lineId)
->orderBy('c.id', 'DESC')
->setMaxResults(1)
->getQuery()
->getSingleScalarResult();
}
}
我终于做到了:
$cart = new Cart;
$lastCartId = $em->getRepository('CMPlatformBundle:Cart')->getLastCartIdForLine($lineId);
$cart->setCartId($lastCartId+1);
$em->persist($cart);
有效,但不确定这是否是处理此问题的最佳方式。如果您找到更好的东西,请告诉我。