public function test()
{
$model = new Customer();
$data = [
'phone' => '11012010086'
];
$model->replace(true)->save($data);
return $model->getLastSql();
}问题描述:/**
* 插入记录
* @access public
* @param Query $query 查询对象
* @param boolean $getLastInsID 返回自增主键
* @return mixed
*/
public function insert(Query $query, bool $getLastInsID = false)
{
// 分析查询表达式
$options = $query->parseOptions();
// 生成SQL语句
$sql = $this->builder->insert($query);
此处的代码根据builder走向不同的类, 测试代码中的模型操作在这里指向了 /**
* 生成Insert SQL
* @access public
* @param Query $query 查询对象
* @param bool $replace 是否replace
* @return string
*/
public function insert(Query $query, bool $replace = false): string
{
$options = $query->getOptions();
// 分析并处理数据
$data = $this->parseData($query, $options['data']);
if (empty($data)) {
return '';
}
$set = [];
foreach ($data as $key => $val) {
$set[] = $key . ' = ' . $val;
}
return str_replace(
['%INSERT%', '%EXTRA%', '%TABLE%', '%PARTITION%', '%SET%', '%DUPLICATE%', '%COMMENT%'],
[
$replace ? 'REPLACE' : 'INSERT',
$this->parseExtra($query, $options['extra']),
$this->parseTable($query, $options['table']),
$this->parsePartition($query, $options['partition']),
implode(' , ', $set),
$this->parseDuplicate($query, $options['duplicate']),
$this->parseComment($query, $options['comment']),
],
$this->insertSql);
}可以看到源码中此处的$replace是作为方法的参数单独存在的,而测试代码中replace()的设置在$options数组中,因此导致replace()未生效$replace ? 'REPLACE' : 'INSERT',为与think/db/Builder中的一致!empty($options['replace']) ? 'REPLACE' : 'INSERT',来修复该问题,但暂不清楚$replace作为单独参数存在的意义,希望@ThinkPHP 流年能解惑。
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。