改进Relation类支持多对多新增

This commit is contained in:
thinkphp
2016-04-20 12:12:06 +08:00
parent c792be0358
commit 203db9c2a8

View File

@@ -12,6 +12,8 @@
namespace think\model; namespace think\model;
use think\Db; use think\Db;
use think\Exception;
use think\model\Pivot;
class Relation class Relation
{ {
@@ -20,9 +22,9 @@ class Relation
const BELONGS_TO = 3; const BELONGS_TO = 3;
const BELONGS_TO_MANY = 4; const BELONGS_TO_MANY = 4;
// 父模型 // 父模型对象
protected $parent; protected $parent;
// 当前的模型类 // 当前关联的模型类
protected $model; protected $model;
// 中间表模型 // 中间表模型
protected $middle; protected $middle;
@@ -41,7 +43,6 @@ class Relation
public function __construct($model) public function __construct($model)
{ {
$this->parent = $model; $this->parent = $model;
$this->db = $model->db();
} }
/** /**
@@ -439,50 +440,69 @@ class Relation
* 保存当前关联数据对象 * 保存当前关联数据对象
* @access public * @access public
* @param array $data 数据 * @param array $data 数据
* @param array $pivot 中间表额外数据
* @return integer * @return integer
*/ */
public function save($data, $pivot = []) public function save(array $data, array $pivot = [])
{ {
// 判断关联类型执行查询 // 判断关联类型
switch ($this->type) { switch ($this->type) {
case self::HAS_ONE: case self::HAS_ONE:
case self::BELONGS_TO: case self::BELONGS_TO:
case self::HAS_MANY: case self::HAS_MANY:
$data[$this->foreignKey] = $this->parent->{$this->localKey}; $data[$this->foreignKey] = $this->parent->{$this->localKey};
break; $model = new $this->model;
return $model->save($data);
case self::BELONGS_TO_MANY: case self::BELONGS_TO_MANY:
break; // 保存关联表数据
$model = new $this->model;
$result = $model->save($data);
if ($result) {
// 保存中间表数据
$pk = $this->parent->getPk();
$relationFk = $model->getPk();
$pivot[$this->localKey] = $this->parent->$pk;
$pivot[$this->foreignKey] = $model->$relationFk;
$result = Db::table($this->middle)->insert($pivot);
}
return $result;
} }
$model = new $this->model;
return $model->save($data);
} }
/** /**
* 保存当前关联数据对象 * 批量保存当前关联数据对象
* @access public * @access public
* @param array $data 数据 * @param array $dataSet 数据
* @param array $pivot 中间表额外数据
* @return integer * @return integer
*/ */
public function saveAll($dataSet, $pivot = []) public function saveAll(array $dataSet, array $pivot = [])
{ {
foreach ($dataSet as $data) { $result = false;
// 判断关联类型执行查询 foreach ($dataSet as $key => $data) {
// 判断关联类型
switch ($this->type) { switch ($this->type) {
case self::HAS_MANY: case self::HAS_MANY:
$data[$this->foreignKey] = $this->parent->{$this->localKey}; $data[$this->foreignKey] = $this->parent->{$this->localKey};
$result = $this->save($data);
break; break;
case self::BELONGS_TO_MANY: case self::BELONGS_TO_MANY:
// TODO
$result = $this->save($data, !empty($pivot) ? $pivot[$key] : []);
break; break;
} }
} }
$model = new $this->model; return $result;
return $model->saveAll($dataSet);
} }
public function __call($method, $args) public function __call($method, $args)
{ {
$model = new $this->model; if ($this->model) {
return call_user_func_array([$model->db(), $method], $args); $model = new $this->model;
return call_user_func_array([$model->db(), $method], $args);
} else {
throw new Exception(__CLASS__ . ':' . $method . ' method not exist');
}
} }
} }