apinnecke/composite-number-range-behavior

此包已被弃用,不再维护。未建议替代包。

提供外键和组合键的复合数字范围的行为。

0.2.1 2015-07-15 18:44 UTC

This package is not auto-updated.

Last update: 2022-08-20 05:49:04 UTC


README

CompositeNumberRangeBehavior

为Propel 2提供组合键组合的数字范围的行为。此行为仅在MySQL中有效!

Build Status Latest Stable Version Total Downloads

什么?数字范围?那是啥?

考虑一个包含自增id字段、外键和作为自增字段行为的复合id字段的表。每个新的外键id值从零开始。示例

<table name="user">
    <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
    <column name="username" type="VARCHAR" size="100" required="true" />
</table>

<table name="document">
    <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
    <column name="user_id" type="INTEGER" required="true" />
    <column name="user_document_id" type="INTEGER" required="true" />
    
    <foreign-key foreignTable="user">
        <reference local="user_id" foreign="id" />
    </foreign-key>
</table>

文档表的示例内容

id user_id user_document_id
1 1 1
2 1 2
3 2 1
4 2 2
5 3 1
6 3 2
7 1 3
8 1 4

如你所见,user_document_id在每次不同的user_id时从零开始!这被称为数字范围。太好了

此行为是如何工作的?

用户_document_id的生成是通过触发器完成的,该触发器由此行为提供的自定义MySQLPlatform自动创建。当前id存储在sequence_table中以防止从document表中删除行时的重复键。

注册平台

app/config/config.yml中添加您的连接名称的平台

propel:
    generator:
        defaultConnection: default
        connections:       [ default ]
        platformClass:     \APinnecke\CompositeNumberRange\Platform\MysqlPlatform

将行为添加到表

按照用户 <-> 文档示例

<table name="document">
    <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
    <behavior name="\APinnecke\CompositeNumberRange\CompositeNumberRangeBehavior">
        <parameter name="foreignTable" value="user"/>
    </behavior>
</table>

现在将自动生成以下内容:- user_id列 - 从document.user_id到user.id的外键 - user_document_id列 - 带有user_id和user_document_id的唯一索引 - 由table_name、user_id和user_max_document_id列组成的sequence table user_sequence - setDocumentUserId触发器

代码示例

$user = new \User();
$user->setName('Alfred');
$user->save();

$document = new \Document();
$document->setUser($user);
$document->save();

$userDocumentId = $document->getUserDocumentId();
// $userDocumentId contains 1

迁移通知

由于propel:migrations:diff对触发器一无所知,它们必须通过SQL语句进行检查。如果你使用触发器并在任何带有触发器的表上更改内容,它们将始终出现在你的迁移的down()部分。目前你必须手动删除它们,这个错误将在Propel 2发布时得到解决。