5.0.0 - 致命 - 未处理
SQLSTATE[42000]: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]关键字 'pivot' 附近有语法错误。SELECT T1.* FROM (SELECT thinkphp.*, ROW_NUMBER() OVER ( ORDER BY rand()) AS ROW_NUMBER FROM (SELECT [tb_auth].*,pivot.admin_id AS pivot__admin_id,pivot.auth_id AS pivot__auth_id,pivot.id AS pivot__id FROM [tb_auth] INNER JOIN [tb_admin_auth] [pivot] ON [pivot].[auth_id]=[tb_auth].[id] WHERE [pivot].[admin_id] IN ('1')) AS thinkphp) AS T1class AdminModel extends Model
{
protected $table = 'tb_admin';
protected $pk = 'id';
protected $insert = ['add_time'];
protected $readonly = ['id'];
protected function setAddTimeAttr($value, $data = [])
{
return date('Y-m-d H:i:s');
}
public function Auth()
{
return $this->belongsToMany(AuthModel::class,AdminAuthModel::class,'auth_id','admin_id');
}
}class AuthModel extends Model
{
protected $table = 'tb_auth';
protected $pk = 'id';
}class AdminAuthModel extends Pivot
{
protected $table = 'tb_admin_auth';
protected $pk = 'id';
} $data=AdminModel::with('Auth')->select();原因猜测是belongsToManyQuery中 ->field(true, false, $table, 'pivot', 'pivot__');生成的
pivot.id AS pivot__id 这样的field无法通过parseKey正常解析出加上[ ]
可能的修复方法:
parseField像parseJoin一样explode(' AS ', $val, 2);
protected function parseField(Query $query, $fields)
{
if ('*' == $fields || empty($fields)) {
$fieldsStr = '*';
} elseif (is_array($fields)) {
// 支持 'field1'=>'field2' 这样的字段别名定义
$array = [];
foreach ($fields as $key => $field) {
if (!is_numeric($key)) {
$array[] = $this->parseKey($query, $key) . ' AS ' . $this->parseKey($query, $field, true);
} elseif (strpos($field, ' AS ')) {
list($val1, $val2) = explode(' AS ', $field, 2);
$array[] = $this->parseKey($query, $val1) . ' AS ' . $this->parseKey($query, $val2);
} else {
$array[] = $this->parseKey($query, $field);
}
}
$fieldsStr = implode(',', $array);
} 