一对一关联定义支持指定 join类型 用于预载入查询

This commit is contained in:
thinkphp
2016-06-09 17:19:13 +08:00
parent fb5f93f429
commit 34a08232aa
3 changed files with 15 additions and 7 deletions

View File

@@ -1093,15 +1093,16 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
* @param string $foreignKey 关联外键 * @param string $foreignKey 关联外键
* @param string $localKey 关联主键 * @param string $localKey 关联主键
* @param array $alias 别名定义 * @param array $alias 别名定义
* @param string $joinType JOIN类型
* @return Relation * @return Relation
*/ */
public function hasOne($model, $foreignKey = '', $localKey = '', $alias = []) public function hasOne($model, $foreignKey = '', $localKey = '', $alias = [], $joinType = 'INNER')
{ {
// 记录当前关联信息 // 记录当前关联信息
$model = $this->parseModel($model); $model = $this->parseModel($model);
$localKey = $localKey ?: $this->getPk(); $localKey = $localKey ?: $this->getPk();
$foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id'; $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 $foreignKey 关联外键
* @param string $otherKey 关联主键 * @param string $otherKey 关联主键
* @param array $alias 别名定义 * @param array $alias 别名定义
* @param string $joinType JOIN类型
* @return Relation * @return Relation
*/ */
public function belongsTo($model, $foreignKey = '', $otherKey = '', $alias = []) public function belongsTo($model, $foreignKey = '', $otherKey = '', $alias = [], $joinType = 'INNER')
{ {
// 记录当前关联信息 // 记录当前关联信息
$model = $this->parseModel($model); $model = $this->parseModel($model);
$foreignKey = $foreignKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id'; $foreignKey = $foreignKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id';
$otherKey = $otherKey ?: (new $model)->getPk(); $otherKey = $otherKey ?: (new $model)->getPk();
return $this->relation()->belongsTo($model, $foreignKey, $otherKey, $alias); return $this->relation()->belongsTo($model, $foreignKey, $otherKey, $alias, $joinType);
} }
/** /**

View File

@@ -1391,7 +1391,7 @@ class Query
$joinName = Loader::parseName(basename(str_replace('\\', '/', $info['model']))); $joinName = Loader::parseName(basename(str_replace('\\', '/', $info['model'])));
$joinAlias = isset($info['alias'][$joinName]) ? $info['alias'][$joinName] : $joinName; $joinAlias = isset($info['alias'][$joinName]) ? $info['alias'][$joinName] : $joinName;
$this->via($joinAlias); $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) { if ($closure) {
// 执行闭包查询 // 执行闭包查询
call_user_func_array($closure, [ & $this]); call_user_func_array($closure, [ & $this]);

View File

@@ -41,6 +41,8 @@ class Relation
protected $localKey; protected $localKey;
// 数据表别名 // 数据表别名
protected $alias; protected $alias;
// 当前关联的JOIN类型
protected $joinType;
/** /**
* 架构函数 * 架构函数
@@ -396,15 +398,17 @@ class Relation
* @param string $foreignKey 关联外键 * @param string $foreignKey 关联外键
* @param string $localKey 关联主键 * @param string $localKey 关联主键
* @param array $alias 别名定义 * @param array $alias 别名定义
* @param string $joinType JOIN类型
* @return $this * @return $this
*/ */
public function hasOne($model, $foreignKey, $localKey, $alias) public function hasOne($model, $foreignKey, $localKey, $alias = [], $joinType = 'INNER')
{ {
$this->type = self::HAS_ONE; $this->type = self::HAS_ONE;
$this->model = $model; $this->model = $model;
$this->foreignKey = $foreignKey; $this->foreignKey = $foreignKey;
$this->localKey = $localKey; $this->localKey = $localKey;
$this->alias = $alias; $this->alias = $alias;
$this->joinType = $joinType;
// 返回关联的模型对象 // 返回关联的模型对象
return $this; return $this;
@@ -417,9 +421,10 @@ class Relation
* @param string $foreignKey 关联外键 * @param string $foreignKey 关联外键
* @param string $otherKey 关联主键 * @param string $otherKey 关联主键
* @param array $alias 别名定义 * @param array $alias 别名定义
* @param string $joinType JOIN类型
* @return $this * @return $this
*/ */
public function belongsTo($model, $foreignKey, $otherKey, $alias) public function belongsTo($model, $foreignKey, $otherKey, $alias = [], $joinType = 'INNER')
{ {
// 记录当前关联信息 // 记录当前关联信息
$this->type = self::BELONGS_TO; $this->type = self::BELONGS_TO;
@@ -427,6 +432,7 @@ class Relation
$this->foreignKey = $foreignKey; $this->foreignKey = $foreignKey;
$this->localKey = $otherKey; $this->localKey = $otherKey;
$this->alias = $alias; $this->alias = $alias;
$this->joinType = $joinType;
// 返回关联的模型对象 // 返回关联的模型对象
return $this; return $this;