修正Model类关联预载入

This commit is contained in:
thinkphp
2016-04-12 17:38:00 +08:00
parent f571555320
commit bfa6c185f3

View File

@@ -65,6 +65,8 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
protected $isUpdate = false; protected $isUpdate = false;
// 当前执行的关联类型 // 当前执行的关联类型
private $relation; private $relation;
// 是否预载入
protected $eagerly = false;
/** /**
* 初始化过的模型. * 初始化过的模型.
@@ -787,10 +789,10 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
*/ */
public function eagerlyResultSet($resultSet, $relation) public function eagerlyResultSet($resultSet, $relation)
{ {
$this->eagerly = true;
$relations = is_string($relation) ? explode(',', $relation) : $relation; $relations = is_string($relation) ? explode(',', $relation) : $relation;
foreach ($relations as $relation) { foreach ($relations as $relation) {
$subRelation = null;
if (strpos($relation, '.')) { if (strpos($relation, '.')) {
list($relation, $subRelation) = explode('.', $relation); list($relation, $subRelation) = explode('.', $relation);
} }
@@ -862,6 +864,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
} }
$this->relation = []; $this->relation = [];
} }
$this->eagerly = false;
return $resultSet; return $resultSet;
} }
@@ -872,8 +875,9 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
* @param string $relation 关联名 * @param string $relation 关联名
* @return Model * @return Model
*/ */
public function eagerlyResult($result, $with) public function eagerlyResult($result, $relation)
{ {
$this->eagerly = true;
$relations = is_string($relation) ? explode(',', $relation) : $relation; $relations = is_string($relation) ? explode(',', $relation) : $relation;
foreach ($relations as $relation) { foreach ($relations as $relation) {
@@ -942,6 +946,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
} }
$this->relation = []; $this->relation = [];
} }
$this->eagerly = false;
return $result; return $result;
} }
@@ -959,7 +964,8 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
$localKey = $localKey ?: $this->pk; $localKey = $localKey ?: $this->pk;
$foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id'; $foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id';
$this->relation = [self::HAS_ONE, $foreignKey, $localKey]; $this->relation = [self::HAS_ONE, $foreignKey, $localKey];
if (isset($this->data[$localKey])) {
if (!$this->eagerly && isset($this->data[$localKey])) {
// 关联查询封装 // 关联查询封装
return $model::where($foreignKey, $this->data[$localKey]); return $model::where($foreignKey, $this->data[$localKey]);
} else { } else {
@@ -982,7 +988,8 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
$foreignKey = $foreignKey ?: $this->pk; $foreignKey = $foreignKey ?: $this->pk;
$localKey = $localKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id'; $localKey = $localKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id';
$this->relation = [self::BELONGS_TO, $foreignKey, $localKey]; $this->relation = [self::BELONGS_TO, $foreignKey, $localKey];
if (isset($this->data[$localKey])) {
if (!$this->eagerly && isset($this->data[$localKey])) {
// 关联查询封装 // 关联查询封装
return $model::where($foreignKey, $this->data[$localKey]); return $model::where($foreignKey, $this->data[$localKey]);
} else { } else {
@@ -1005,7 +1012,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
$foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id'; $foreignKey = $foreignKey ?: Loader::parseName($this->name) . '_id';
$this->relation = [self::HAS_MANY, $foreignKey, $localKey]; $this->relation = [self::HAS_MANY, $foreignKey, $localKey];
if (isset($this->data[$localKey])) { if (!$this->eagerly && isset($this->data[$localKey])) {
// 关联查询封装 // 关联查询封装
return $model::where($foreignKey, $this->data[$localKey]); return $model::where($foreignKey, $this->data[$localKey]);
} else { } else {
@@ -1028,7 +1035,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
$localKey = $localKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id'; $localKey = $localKey ?: Loader::parseName(basename(str_replace('\\', '/', $model))) . '_id';
$this->relation = [self::BELONGS_TO_MANY, $foreignKey, $localKey]; $this->relation = [self::BELONGS_TO_MANY, $foreignKey, $localKey];
if (isset($this->data[$localKey])) { if (!$this->eagerly && isset($this->data[$localKey])) {
// 关联查询封装 // 关联查询封装
return $model::where($foreignKey, $this->data[$localKey]); return $model::where($foreignKey, $this->data[$localKey]);
} else { } else {