diff --git a/library/think/Model.php b/library/think/Model.php index 664caf3a..d7f5644e 100644 --- a/library/think/Model.php +++ b/library/think/Model.php @@ -1093,15 +1093,16 @@ abstract class Model implements \JsonSerializable, \ArrayAccess * @param string $foreignKey 关联外键 * @param string $localKey 关联主键 * @param array $alias 别名定义 + * @param string $joinType JOIN类型 * @return Relation */ - public function hasOne($model, $foreignKey = '', $localKey = '', $alias = []) + public function hasOne($model, $foreignKey = '', $localKey = '', $alias = [], $joinType = 'INNER') { // 记录当前关联信息 $model = $this->parseModel($model); $localKey = $localKey ?: $this->getPk(); $foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id'; - return $this->relation()->hasOne($model, $foreignKey, $localKey, $alias); + return $this->relation()->hasOne($model, $foreignKey, $localKey, $alias, $joinType); } /** @@ -1111,15 +1112,16 @@ abstract class Model implements \JsonSerializable, \ArrayAccess * @param string $foreignKey 关联外键 * @param string $otherKey 关联主键 * @param array $alias 别名定义 + * @param string $joinType JOIN类型 * @return Relation */ - public function belongsTo($model, $foreignKey = '', $otherKey = '', $alias = []) + public function belongsTo($model, $foreignKey = '', $otherKey = '', $alias = [], $joinType = 'INNER') { // 记录当前关联信息 $model = $this->parseModel($model); $foreignKey = $foreignKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id'; $otherKey = $otherKey ?: (new $model)->getPk(); - return $this->relation()->belongsTo($model, $foreignKey, $otherKey, $alias); + return $this->relation()->belongsTo($model, $foreignKey, $otherKey, $alias, $joinType); } /** diff --git a/library/think/db/Query.php b/library/think/db/Query.php index b1c50e13..141cd37f 100644 --- a/library/think/db/Query.php +++ b/library/think/db/Query.php @@ -1391,7 +1391,7 @@ class Query $joinName = Loader::parseName(basename(str_replace('\\', '/', $info['model']))); $joinAlias = isset($info['alias'][$joinName]) ? $info['alias'][$joinName] : $joinName; $this->via($joinAlias); - $this->join($joinTable . ' ' . $joinAlias, $alias . '.' . $info['localKey'] . '=' . $joinAlias . '.' . $info['foreignKey']); + $this->join($joinTable . ' ' . $joinAlias, $alias . '.' . $info['localKey'] . '=' . $joinAlias . '.' . $info['foreignKey'], $info['joinType']); if ($closure) { // 执行闭包查询 call_user_func_array($closure, [ & $this]); diff --git a/library/think/model/Relation.php b/library/think/model/Relation.php index c32fe733..0d3f5aaf 100644 --- a/library/think/model/Relation.php +++ b/library/think/model/Relation.php @@ -41,6 +41,8 @@ class Relation protected $localKey; // 数据表别名 protected $alias; + // 当前关联的JOIN类型 + protected $joinType; /** * 架构函数 @@ -396,15 +398,17 @@ class Relation * @param string $foreignKey 关联外键 * @param string $localKey 关联主键 * @param array $alias 别名定义 + * @param string $joinType JOIN类型 * @return $this */ - public function hasOne($model, $foreignKey, $localKey, $alias) + public function hasOne($model, $foreignKey, $localKey, $alias = [], $joinType = 'INNER') { $this->type = self::HAS_ONE; $this->model = $model; $this->foreignKey = $foreignKey; $this->localKey = $localKey; $this->alias = $alias; + $this->joinType = $joinType; // 返回关联的模型对象 return $this; @@ -417,9 +421,10 @@ class Relation * @param string $foreignKey 关联外键 * @param string $otherKey 关联主键 * @param array $alias 别名定义 + * @param string $joinType JOIN类型 * @return $this */ - public function belongsTo($model, $foreignKey, $otherKey, $alias) + public function belongsTo($model, $foreignKey, $otherKey, $alias = [], $joinType = 'INNER') { // 记录当前关联信息 $this->type = self::BELONGS_TO; @@ -427,6 +432,7 @@ class Relation $this->foreignKey = $foreignKey; $this->localKey = $otherKey; $this->alias = $alias; + $this->joinType = $joinType; // 返回关联的模型对象 return $this;