apinnecke / composite-number-range-behavior
此包已被弃用,不再维护。未建议替代包。
提供外键和组合键的复合数字范围的行为。
0.2.1
2015-07-15 18:44 UTC
Requires
- propel/propel: 2.0.*@dev
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2022-08-20 05:49:04 UTC
README
CompositeNumberRangeBehavior
为Propel 2提供组合键组合的数字范围的行为。此行为仅在MySQL中有效!
什么?数字范围?那是啥?
考虑一个包含自增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发布时得到解决。