于是开始怀疑是表名的问题,我 sql server 中表名是 stock ,架构是 product ,连起来应该是 product.stock,所以在model中我这样写 protected $table = 'product.stock';
一直报错找不到字段,一路追踪找到了这个位置 \thinkphp\library\think\db\connector\Sqlsrv.php 第50行,
public function getFields($tableName)
{
list($tableName) = explode(' ', $tableName); //tp5
$sql = "SELECT column_name, data_type, column_default, is_nullable
FROM information_schema.tables AS t
JOIN information_schema.columns AS c
ON t.table_catalog = c.table_catalog
AND t.table_schema = c.table_schema
AND t.table_name = c.table_name
WHERE t.table_name = '$tableName'";
...
这样一来经过 list 那条语句时 $tableName 的值并没有变化,这段$sql执行起来也不能返回出表信息
于是我按照 list 的语句,重新写了我的 model 里的语句:protected $table = 'stock product';
这样一来能获取整张表的信息了,但是在 insert 时又会出错,很明显 'insert into stock product .....' 怎么看都是错的
既然这里不能改,就只能改 list 语句了
// list($tableName) = explode(' ', $tableName); //tp5
list($schema, $tableName) = explode('.', $tableName); // chunboli
这样修改之后就可以正常使用了。
事后我查阅了tp论坛,发现关于sql server的讨论很少,即便有人使用也没有人报出这个错误。
我不知道是他们没遇到,还是没有使用 sql server的"架构"命名方式。
官方文档也没有提到 遇到 这种情况怎么办,我只能这样临时手动改了。
如果tp5有相应解决办法,请指出。如果没有考虑过这种情况请改进。
最佳答案