据我所知,CakePHP 3.x 支持声称支持 PostgreSQL 8+,但在实践中,我发现在 PostgreSQL 8.3 之前,regclass::text 缺少一个开箱即用的演员表。如果你在 CakePHP 3 中尝试一个简单的模型,你会得到一个类似这样的错误
There was 1 error:
1) App\Test\TestCase\Model\Table\SampleListsTableTest::testFoo
Cake\Database\Exception: SQLSTATE[42846]: Cannot coerce: 7 ERROR: cannot cast type regclass to text
LINE 11: ... pg_get_serial_sequence(attr.attrelid::regclass::text, attr...
这是因为 regclass::text 转换直到 PostgreSQL 8.3 才存在。我在 PostgreSQL 8.2 的多个实例上检查了这一点。修复相当容易,但不是很明显。
DROP CAST IF EXISTS (regclass AS text);
CREATE OR REPLACE FUNCTION public.text(regclass) RETURNS text STRICT
STABLE AS '
SELECT pg_catalog.textin(pg_catalog.regclassout($1::regclass));'
LANGUAGE 'SQL';
CREATE CAST (regclass AS text) WITH FUNCTION public.text(regclass);
我不确定这是否应该被认为是 CakePHP 3.x 中的一个错误,或者是否应该将它作为安装说明中对旧 Postgres 支持的警告包含在内,但无论哪种方式,如果有人可以确认这种行为,那就太好了。