Doctrine2 / MySQL - 在多列上创建自动增量字段

时间:2015-07-23 12:18:50

标签: mysql symfony doctrine-orm multiple-columns auto-increment

我想知道是否有可能基于多列的自动增量字段?

这是我的问题: 我有一张桌子,用于存放LINES中的CARTS。我为每个购物车都有一个唯一的ID,但我也想为每一行生成一个唯一的ID。所以我可以在一行内有一个独特的CART ID。

实际上,我想从MySQL doc中完全按照这个例子中那样做:

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 |
+--------+----+---------+

grp列中的id递增。

我对主键/索引有点失落,我不知道是否必须使用它们来生成我的ID。

我尝试将此添加到我的symfony实体中,但它没有生成具有我想要的id的新列。

 * @ORM\Table(indexes={@ORM\Index(name="line_idx", columns={"line_id"})})

2 个答案:

答案 0 :(得分:1)

好吧,我设法做了我想做的事情,我不确定这是不是最好的方法,但这就是我的做法:

我添加了我的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);

它有效,不确定它是否是处理此问题的最佳方法。如果你找到更好的东西,请告诉我。

答案 1 :(得分:0)

我认为这可能就是你要做的事情:

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注释标记属性grp@Id,以便两者都成为主键的一部分。然后,您只使用id注释标记@GeneratedValue以使其自动增加。

请确保您使用的是 MyISAM ,因为 InnoDB 似乎不支持此功能。

注意: @GeneratedValue注释必须始终作为@Id的属性标记的一部分,如official documentation中所述。