提交 cc9ab994 编写于 作者: weixin_47267244's avatar weixin_47267244

修复查询构建器别名功能下的绑定参数问题

上级 e049a5e5
...@@ -115,11 +115,11 @@ class Query implements IQuery ...@@ -115,11 +115,11 @@ class Query implements IQuery
protected $resultClass = Result::class; protected $resultClass = Result::class;
/** /**
* 别名 Sql 集合. * 别名 Sql 数据集合.
* *
* @var string[] * @var array
*/ */
protected static $aliasSqls = []; protected static $aliasSqlMap = [];
/** /**
* @param \Imi\Db\Interfaces\IDb|null $db * @param \Imi\Db\Interfaces\IDb|null $db
...@@ -1043,15 +1043,51 @@ class Query implements IQuery ...@@ -1043,15 +1043,51 @@ class Query implements IQuery
public function select(): IResult public function select(): IResult
{ {
$alias = $this->alias; $alias = $this->alias;
$aliasSqls = &static::$aliasSqls; $aliasSqlMap = &static::$aliasSqlMap;
if ($alias && isset($aliasSqls[$alias])) if ($alias && isset($aliasSqlMap[$alias]))
{ {
$sql = $aliasSqls[$alias]; $aliasSqlData = $aliasSqlMap[$alias];
$sql = $aliasSqlData['sql'];
$binds = $aliasSqlData['binds'];
if ($binds)
{
if ($this->binds)
{
$this->binds = array_merge($binds, $this->binds);
}
else
{
$this->binds = $binds;
}
}
} }
else else
{ {
if ($alias)
{
$binds = $this->binds;
$this->binds = [];
}
$builder = new SelectBuilder($this); $builder = new SelectBuilder($this);
$aliasSqls[$alias] = $sql = $builder->build(); $sql = $builder->build();
if ($alias)
{
// @phpstan-ignore-next-line
$originBinds = $binds;
$binds = $this->binds;
if ($binds)
{
$this->binds = array_merge($originBinds, $binds);
}
else
{
$this->binds = $originBinds;
}
$aliasSqlMap[$alias] = [
'sql' => $sql,
'binds' => $binds,
];
}
} }
if (!$this->isInitQueryType && !$this->isInTransaction()) if (!$this->isInitQueryType && !$this->isInTransaction())
{ {
...@@ -1097,10 +1133,23 @@ class Query implements IQuery ...@@ -1097,10 +1133,23 @@ class Query implements IQuery
public function insert($data = null): IResult public function insert($data = null): IResult
{ {
$alias = $this->alias; $alias = $this->alias;
$aliasSqls = &static::$aliasSqls; $aliasSqlMap = &static::$aliasSqlMap;
if ($alias && isset($aliasSqls[$alias])) if ($alias && isset($aliasSqlMap[$alias]))
{ {
$sql = $aliasSqls[$alias]; $aliasSqlData = $aliasSqlMap[$alias];
$sql = $aliasSqlData['sql'];
$binds = $aliasSqlData['binds'];
if ($binds)
{
if ($this->binds)
{
$this->binds = array_merge($binds, $this->binds);
}
else
{
$this->binds = $binds;
}
}
$bindValues = []; $bindValues = [];
$numberKey = isset($data[0]); $numberKey = isset($data[0]);
foreach ($data as $k => $v) foreach ($data as $k => $v)
...@@ -1118,8 +1167,21 @@ class Query implements IQuery ...@@ -1118,8 +1167,21 @@ class Query implements IQuery
} }
else else
{ {
if ($alias)
{
$binds = $this->binds;
$this->binds = [];
}
$builder = new InsertBuilder($this); $builder = new InsertBuilder($this);
$aliasSqls[$alias] = $sql = $builder->build($data); $sql = $builder->build($data);
if ($alias)
{
$aliasSqlMap[$alias] = [
'sql' => $sql,
// @phpstan-ignore-next-line
'binds' => $binds,
];
}
} }
return $this->execute($sql); return $this->execute($sql);
...@@ -1151,10 +1213,23 @@ class Query implements IQuery ...@@ -1151,10 +1213,23 @@ class Query implements IQuery
public function update($data = null): IResult public function update($data = null): IResult
{ {
$alias = $this->alias; $alias = $this->alias;
$aliasSqls = &static::$aliasSqls; $aliasSqlMap = &static::$aliasSqlMap;
if ($alias && isset($aliasSqls[$alias])) if ($alias && isset($aliasSqlMap[$alias]))
{ {
$sql = $aliasSqls[$alias]; $aliasSqlData = $aliasSqlMap[$alias];
$sql = $aliasSqlData['sql'];
$binds = $aliasSqlData['binds'];
if ($binds)
{
if ($this->binds)
{
$this->binds = array_merge($binds, $this->binds);
}
else
{
$this->binds = $binds;
}
}
$bindValues = []; $bindValues = [];
foreach ($data as $k => $v) foreach ($data as $k => $v)
{ {
...@@ -1164,8 +1239,31 @@ class Query implements IQuery ...@@ -1164,8 +1239,31 @@ class Query implements IQuery
} }
else else
{ {
if ($alias)
{
$binds = $this->binds;
$this->binds = [];
}
$builder = new UpdateBuilder($this); $builder = new UpdateBuilder($this);
$aliasSqls[$alias] = $sql = $builder->build($data); $sql = $builder->build($data);
if ($alias)
{
// @phpstan-ignore-next-line
$originBinds = $binds;
$binds = $this->binds;
if ($binds)
{
$this->binds = array_merge($originBinds, $binds);
}
else
{
$this->binds = $originBinds;
}
$aliasSqlMap[$alias] = [
'sql' => $sql,
'binds' => $binds,
];
}
} }
return $this->execute($sql); return $this->execute($sql);
...@@ -1181,10 +1279,23 @@ class Query implements IQuery ...@@ -1181,10 +1279,23 @@ class Query implements IQuery
public function replace($data = null): IResult public function replace($data = null): IResult
{ {
$alias = $this->alias; $alias = $this->alias;
$aliasSqls = &static::$aliasSqls; $aliasSqlMap = &static::$aliasSqlMap;
if ($alias && isset($aliasSqls[$alias])) if ($alias && isset($aliasSqlMap[$alias]))
{ {
$sql = $aliasSqls[$alias]; $aliasSqlData = $aliasSqlMap[$alias];
$sql = $aliasSqlData['sql'];
$binds = $aliasSqlData['binds'];
if ($binds)
{
if ($this->binds)
{
$this->binds = array_merge($binds, $this->binds);
}
else
{
$this->binds = $binds;
}
}
$bindValues = []; $bindValues = [];
foreach ($data as $k => $v) foreach ($data as $k => $v)
{ {
...@@ -1194,8 +1305,31 @@ class Query implements IQuery ...@@ -1194,8 +1305,31 @@ class Query implements IQuery
} }
else else
{ {
if ($alias)
{
$binds = $this->binds;
$this->binds = [];
}
$builder = new ReplaceBuilder($this); $builder = new ReplaceBuilder($this);
$aliasSqls[$alias] = $sql = $builder->build($data); $sql = $builder->build($data);
if ($alias)
{
// @phpstan-ignore-next-line
$originBinds = $binds;
$binds = $this->binds;
if ($binds)
{
$this->binds = array_merge($originBinds, $binds);
}
else
{
$this->binds = $originBinds;
}
$aliasSqlMap[$alias] = [
'sql' => $sql,
'binds' => $binds,
];
}
} }
return $this->execute($sql); return $this->execute($sql);
...@@ -1209,15 +1343,51 @@ class Query implements IQuery ...@@ -1209,15 +1343,51 @@ class Query implements IQuery
public function delete(): IResult public function delete(): IResult
{ {
$alias = $this->alias; $alias = $this->alias;
$aliasSqls = &static::$aliasSqls; $aliasSqlMap = &static::$aliasSqlMap;
if ($alias && isset($aliasSqls[$alias])) if ($alias && isset($aliasSqlMap[$alias]))
{ {
$sql = $aliasSqls[$alias]; $aliasSqlData = $aliasSqlMap[$alias];
$sql = $aliasSqlData['sql'];
$binds = $aliasSqlData['binds'];
if ($binds)
{
if ($this->binds)
{
$this->binds = array_merge($binds, $this->binds);
}
else
{
$this->binds = $binds;
}
}
} }
else else
{ {
if ($alias)
{
$binds = $this->binds;
$this->binds = [];
}
$builder = new DeleteBuilder($this); $builder = new DeleteBuilder($this);
$aliasSqls[$alias] = $sql = $builder->build(); $sql = $builder->build();
if ($alias)
{
// @phpstan-ignore-next-line
$originBinds = $binds;
$binds = $this->binds;
if ($binds)
{
$this->binds = array_merge($originBinds, $binds);
}
else
{
$this->binds = $originBinds;
}
$aliasSqlMap[$alias] = [
'sql' => $sql,
'binds' => $binds,
];
}
} }
$result = $this->execute($sql); $result = $this->execute($sql);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册