mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-06 15:02:47 +08:00
多对多关联设置中间表模型
增加wherePivot方法
This commit is contained in:
@@ -20,9 +20,12 @@ use think\model\Relation;
|
|||||||
|
|
||||||
class BelongsToMany extends Relation
|
class BelongsToMany extends Relation
|
||||||
{
|
{
|
||||||
// 中间表模型
|
// 中间表表名
|
||||||
protected $middle;
|
protected $middle;
|
||||||
|
|
||||||
|
// 中间表模型
|
||||||
|
protected $pivot;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造函数
|
* 构造函数
|
||||||
* @access public
|
* @access public
|
||||||
@@ -42,6 +45,28 @@ class BelongsToMany extends Relation
|
|||||||
$this->query = (new $model)->db();
|
$this->query = (new $model)->db();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置中间表模型
|
||||||
|
* @param $pivot
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function pivot($pivot)
|
||||||
|
{
|
||||||
|
$this->pivot = $pivot;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实例化中间表模型
|
||||||
|
* @param $data
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
protected function newPivot($data)
|
||||||
|
{
|
||||||
|
$pivot = $this->pivot ?: '\\think\\model\\Pivot';
|
||||||
|
return new $pivot($data, $this->middle);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 延迟获取关联数据
|
* 延迟获取关联数据
|
||||||
* @param string $subRelation 子关联名
|
* @param string $subRelation 子关联名
|
||||||
@@ -54,7 +79,7 @@ class BelongsToMany extends Relation
|
|||||||
$localKey = $this->localKey;
|
$localKey = $this->localKey;
|
||||||
$middle = $this->middle;
|
$middle = $this->middle;
|
||||||
if ($closure) {
|
if ($closure) {
|
||||||
call_user_func_array($closure, [ & $this->query]);
|
call_user_func_array($closure, [& $this->query]);
|
||||||
}
|
}
|
||||||
// 关联查询
|
// 关联查询
|
||||||
$pk = $this->parent->getPk();
|
$pk = $this->parent->getPk();
|
||||||
@@ -71,7 +96,7 @@ class BelongsToMany extends Relation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$set->pivot = new Pivot($pivot, $this->middle);
|
$set->pivot = $this->newPivot($pivot);
|
||||||
}
|
}
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
@@ -95,12 +120,27 @@ class BelongsToMany extends Relation
|
|||||||
* @access public
|
* @access public
|
||||||
* @param mixed $where 查询条件(数组或者闭包)
|
* @param mixed $where 查询条件(数组或者闭包)
|
||||||
* @return Query
|
* @return Query
|
||||||
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function hasWhere($where = [])
|
public function hasWhere($where = [])
|
||||||
{
|
{
|
||||||
throw new Exception('relation not support: hasWhere');
|
throw new Exception('relation not support: hasWhere');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置中间表的查询条件
|
||||||
|
* @param $field
|
||||||
|
* @param null $op
|
||||||
|
* @param null $condition
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function wherePivot($field, $op = null, $condition = null)
|
||||||
|
{
|
||||||
|
$field = 'pivot.' . $field;
|
||||||
|
$this->query->where($field, $op, $condition);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 预载入关联查询(数据集)
|
* 预载入关联查询(数据集)
|
||||||
* @access public
|
* @access public
|
||||||
@@ -230,7 +270,7 @@ class BelongsToMany extends Relation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$set->pivot = new Pivot($pivot, $this->middle);
|
$set->pivot = $this->newPivot($pivot);
|
||||||
$data[$pivot[$this->localKey]][] = $set;
|
$data[$pivot[$this->localKey]][] = $set;
|
||||||
}
|
}
|
||||||
return $data;
|
return $data;
|
||||||
@@ -327,7 +367,7 @@ class BelongsToMany extends Relation
|
|||||||
foreach ($ids as $id) {
|
foreach ($ids as $id) {
|
||||||
$pivot[$this->foreignKey] = $id;
|
$pivot[$this->foreignKey] = $id;
|
||||||
$this->query->table($this->middle)->insert($pivot, true);
|
$this->query->table($this->middle)->insert($pivot, true);
|
||||||
$result[] = new Pivot($pivot, $this->middle);
|
$result[] = $this->newPivot($pivot);
|
||||||
}
|
}
|
||||||
if (count($result) == 1) {
|
if (count($result) == 1) {
|
||||||
// 返回中间表模型对象
|
// 返回中间表模型对象
|
||||||
|
|||||||
Reference in New Issue
Block a user