使用FileMaker作为CWP的后端数据库
0.2.1
2018-07-10 20:56 UTC
Requires
- php: >=7.0.0
- doctrine/dbal: 2.*
- doctrine/orm: 2.*
- greenlion/php-sql-parser: ^4.0
- guzzlehttp/guzzle: ^6.2
- matatirosoln/filemaker-api: ^15.0
Requires (Dev)
- doctrine/doctrine-bundle: ^1.6
- phpunit/phpunit: @stable
- sensio/framework-extra-bundle: 3.*
- symfony/framework-bundle: 3.*
- symfony/validator: 3.*
- symfony/yaml: 3.*
README
一个 Doctrine 驱动程序,用于通过 CWP API 与 FileMaker 交互。
安装
composer require matatirosoln/doctrine-filemaker-driver
配置
在您的 Doctrine 配置中注释掉以下内容
driver: xxxx
并将其替换为以下内容
driver_class: MSDev\DoctrineFileMakerDriver\FMDriver
约定
-
创建一个模型来表示 FileMaker 的 布局。将布局的名称设置为模型表。
/** * Keyword * * @Table(name="Keyword") * @Entity(repositoryClass="Repository\KeywordRepository") */ class Keyword
-
在您的模型中创建一个 id 字段,并将其映射到特殊的 rec_id 伪字段
/** * @var int * * @Column(name="rec_id", type="integer") */ private $id;
-
创建您的“实际”ID字段,用作关系,作为模型的一个单独属性。将其 GeneratedValue 策略设置为
Custom
,这意味着 Doctrie 将等待 FM 分配该值 - 假设这是一个自动输入计算字段(可能是 Get(UUID))。然后您需要指定 CustomIdGenerator 并将其设置为MSDev\DoctrineFileMakerDriver\FMIdentityGenerator
,以便以字符串的形式返回该值。/** * @var string * * @Column(name="_pk_ClientID", type="string" length=255) * @Id * @GeneratedValue(strategy="CUSTOM") * @CustomIdGenerator(class="MSDev\DoctrineFileMakerDriver\FMIdentityGenerator") */ private $uuid;
或者,您可以在模型构造函数中生成 UUID(例如,使用 ramsey/uuid)。在这种情况下,您将得到类似以下的内容
/** * @var string * * @Column(name="__pk_CanvasID", type="string", length=255) * @Id */ private $uuid; public function __construct() { $this->uuid = Uuid::uuid4()->toString(); }
-
根据需要添加其他属性。要访问布局上的相关字段,请在列映射中将字段名称用单引号括起来。
/** * @var string * * @Column(name="'absCon::email'", type="string", length=255) */ private $contactEmail;
-
如果您需要访问记录修改 ID,可以添加特殊的 mod_id 伪属性
/** * @var int * * @Column(name="mod_id", type="integer") */ private $modId;
-
要访问查询元数据,添加一个类型为 json_array 的 rec_meta 伪属性
/** * @var array * * @Column(name="rec_meta", type="json_array") */ private $meta;
这将填充一个包含以下内容的数组
[ 'found' => (int)$this->response->getFoundSetCount(), 'fetch' => (int)$this->response->getFetchCount(), 'total' => (int)$this->response->getTableRecordCount(), ]
然后您可以从返回集中任何记录中访问它。
注意事项
- 由于更“传统”数据库处理关系的这种方式,没有“门户”的概念。要访问相关数据,为该表(布局)创建相应的模型,并创建标准的 Doctrine 关系(一对一、一对多、多对一等)。
- 如果您的模型包含计算字段,则在尝试创建新记录时可能会遇到问题,因为 Doctrine 将尝试将这些字段设置为 null。一个“解决方案”是创建一个只包含创建新记录所需的字段的“占位符”模型,并在创建记录时实例化该模型。如果您选择走这条路,您可能想创建一个接口,您的占位符和真实实体都实现该接口,以便您可以适当地类型提示。
另请参阅
此驱动程序是为在 Symfony 应用程序中使用而开发的(因为这是我们做的事情)。Doctrine FileMaker 扩展包包括此驱动程序以及创建用于访问脚本、容器、值列表等的服务。