diff --git a/library/think/Model.php b/library/think/Model.php index a7e5dda2..9abc1c2b 100644 --- a/library/think/Model.php +++ b/library/think/Model.php @@ -107,6 +107,8 @@ abstract class Model implements \JsonSerializable, \ArrayAccess protected $batchValidate = false; // 查询数据集对象 protected $resultSetType; + // 关联自动写入 + protected $relationWrite; // protected static $db; @@ -657,6 +659,21 @@ abstract class Model implements \JsonSerializable, \ArrayAccess return $collection; } + /** + * 关联数据一起更新 + * @access public + * @param mixed $relation 关联 + * @return $this + */ + public function together($relation) + { + if (is_string($relation)) { + $relation = explode(',', $relation); + } + $this->relationWrite = $relation; + return $this; + } + /** * 获取模型对象的主键 * @access public @@ -715,6 +732,19 @@ abstract class Model implements \JsonSerializable, \ArrayAccess } } + // 自动关联写入 + if (!empty($this->relationWrite)) { + $relation = []; + foreach ($this->relationWrite as $name) { + if (isset($this->data[$name])) { + $relation[$name] = $this->data[$name]; + if (!$this->isUpdate) { + unset($this->data[$name]); + } + } + } + } + // 检测字段 if (!empty($this->field)) { foreach ($this->data as $key => $val) { @@ -775,7 +805,29 @@ abstract class Model implements \JsonSerializable, \ArrayAccess unset($data[$pk]); } + // 关联更新 + if (isset($relation)) { + foreach ($relation as $name => $val) { + if (isset($data[$name])) { + unset($data[$name]); + } + } + } + + // 模型更新 $result = $this->db()->where($where)->update($data); + + // 关联更新 + if (isset($relation)) { + foreach ($relation as $name => $val) { + if ($val instanceof Model) { + $val->save(); + } else { + $this->getAttr($name)->save($val); + } + } + } + // 清空change $this->change = []; // 更新回调 @@ -802,6 +854,15 @@ abstract class Model implements \JsonSerializable, \ArrayAccess $this->data[$pk] = $insertId; } } + + // 关联写入 + if (isset($relation)) { + foreach ($relation as $name => $val) { + $method = Loader::parseName($name, 1, false); + $this->$method()->save($val); + } + } + // 标记为更新 $this->isUpdate = true; // 清空change diff --git a/library/think/model/relation/OneToOne.php b/library/think/model/relation/OneToOne.php index 0ff739cc..c07cce05 100644 --- a/library/think/model/relation/OneToOne.php +++ b/library/think/model/relation/OneToOne.php @@ -276,7 +276,7 @@ abstract class OneToOne extends Relation // 组装模型数据 $data = []; foreach ($list as $set) { - $data[$set->$key][] = $set; + $data[$set->$key] = $set; } return $data; }