5.1.29在MSSQL下多对多关联出现问题

浏览:1044 发布日期:2018/11/25
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);
        }
评论(
后面还有条评论,点击查看>>