From b3d592da95cfc6591796bfd1ec70f39251747e37 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Wed, 20 Apr 2016 14:30:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E5=AF=B9=E5=A4=9A?= =?UTF-8?q?=E7=9A=84attache=E5=92=8Cdetach=E6=96=B9=E6=B3=95=20=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E5=8D=95=E7=8B=AC=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/model/Relation.php | 96 +++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 25 deletions(-) diff --git a/library/think/model/Relation.php b/library/think/model/Relation.php index 0cf6e4d1..674510cb 100644 --- a/library/think/model/Relation.php +++ b/library/think/model/Relation.php @@ -450,34 +450,13 @@ class Relation case self::HAS_ONE: case self::BELONGS_TO: case self::HAS_MANY: + // 保存关联表数据 $data[$this->foreignKey] = $this->parent->{$this->localKey}; $model = new $this->model; return $model->save($data); case self::BELONGS_TO_MANY: - if (is_array($data)) { - // 保存关联表数据 - $model = new $this->model; - $model->save($data); - $relationFk = $model->getPk(); - $id = $model->$relationFk; - } elseif (is_int($data)) { - // 根据关联表主键直接写入中间表 - $id = $data; - } elseif ($data instanceof Model) { - // 根据关联表主键直接写入中间表 - $relationFk = $data->getPk(); - $id = $data->$relationFk; - } - - if ($id) { - // 保存中间表数据 - $pk = $this->parent->getPk(); - $pivot[$this->localKey] = $this->parent->$pk; - $pivot[$this->foreignKey] = $id; - return Db::table($this->middle)->insert($pivot); - } else { - throw new Exception(' relation data write error'); - } + // 保存关联表/中间表数据 + return $this->attach($data, $pivot); } } @@ -500,13 +479,80 @@ class Relation break; case self::BELONGS_TO_MANY: // TODO - $result = $this->save($data, !empty($pivot) ? $pivot[$key] : []); + $result = $this->attach($data, !empty($pivot) ? $pivot[$key] : []); break; } } return $result; } + /** + * 附加关联的一个中间表数据 + * @access public + * @param mixed $data 数据 可以使用数组、关联模型对象 或者 关联对象的主键 + * @param array $pivot 中间表额外数据 + * @return integer + */ + public function attach($data, $pivot = []) + { + if (is_array($data)) { + // 保存关联表数据 + $model = new $this->model; + $model->save($data); + $relationFk = $model->getPk(); + $id = $model->$relationFk; + } elseif (is_int($data)) { + // 根据关联表主键直接写入中间表 + $id = $data; + } elseif ($data instanceof Model) { + // 根据关联表主键直接写入中间表 + $relationFk = $data->getPk(); + $id = $data->$relationFk; + } + + if ($id) { + // 保存中间表数据 + $pk = $this->parent->getPk(); + $pivot[$this->localKey] = $this->parent->$pk; + $pivot[$this->foreignKey] = $id; + return Db::table($this->middle)->insert($pivot); + } else { + throw new Exception(' miss relation data'); + } + } + + /** + * 解除关联的一个中间表数据 + * @access public + * @param integer|array $data 数据 可以使用关联对象的主键 + * @param bool $relationDel 是否同时删除关联表数据 + * @return integer + */ + public function detach($data, $relatinDel = false) + { + if (is_array($data)) { + $id = $data; + } elseif (is_int($data)) { + // 根据关联表主键直接写入中间表 + $id = $data; + } elseif ($data instanceof Model) { + // 根据关联表主键直接写入中间表 + $relationFk = $data->getPk(); + $id = $data->$relationFk; + } + // 删除中间表数据 + $pk = $this->parent->getPk(); + $pivot[$this->localKey] = $this->parent->$pk; + $pivot[$this->foreignKey] = is_array($id) ? ['in', $id] : $id; + Db::table($this->middle)->where($pivot)->delete(); + + // 删除关联表数据 + if ($relationDel) { + $model = $this->model; + $model::destroy($id); + } + } + public function __call($method, $args) { if ($this->model) {