Model类append方法支持追加关联对象属性

This commit is contained in:
thinkphp
2017-01-23 08:42:20 +08:00
parent 7348729b40
commit 9d1b13b666
2 changed files with 31 additions and 7 deletions

View File

@@ -24,6 +24,8 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
protected $visible = []; protected $visible = [];
// 隐藏属性 // 隐藏属性
protected $hidden = []; protected $hidden = [];
// 追加属性
protected $append = [];
public function __construct($items = []) public function __construct($items = [])
{ {
@@ -69,6 +71,19 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
return $this; return $this;
} }
/**
* 设置需要追加的输出属性
* @access public
* @param array $append 属性列表
* @param bool $override 是否覆盖
* @return $this
*/
public function append($append = [], $override = false)
{
$this->append = [$append, $override];
return $this;
}
public function toArray() public function toArray()
{ {
$result = []; $result = [];
@@ -79,6 +94,9 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
} elseif (!empty($this->hidden)) { } elseif (!empty($this->hidden)) {
$item->hidden($this->hidden[0], $this->hidden[1]); $item->hidden($this->hidden[0], $this->hidden[1]);
} }
if (!empty($this->append)) {
$item->append($this->append[0], $this->append[1]);
}
$result[$key] = $item->toArray(); $result[$key] = $item->toArray();
} else { } else {
$result[$key] = $item; $result[$key] = $item;

View File

@@ -597,10 +597,9 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
public function toArray() public function toArray()
{ {
$item = []; $item = [];
$visible = [];
$hidden = [];
// 过滤属性 // 过滤属性
if (!empty($this->visible)) { if (!empty($this->visible)) {
$visible = [];
$array = []; $array = [];
foreach ($this->visible as $key => $val) { foreach ($this->visible as $key => $val) {
if (is_array($val)) { if (is_array($val)) {
@@ -612,6 +611,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
} }
$data = array_intersect_key($this->data, array_flip($array)); $data = array_intersect_key($this->data, array_flip($array));
} elseif (!empty($this->hidden)) { } elseif (!empty($this->hidden)) {
$hidden = [];
$array = []; $array = [];
foreach ($this->hidden as $key => $val) { foreach ($this->hidden as $key => $val) {
if (is_array($val)) { if (is_array($val)) {
@@ -653,10 +653,16 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
} }
// 追加属性(必须定义获取器) // 追加属性(必须定义获取器)
if (!empty($this->append)) { if (!empty($this->append)) {
foreach ($this->append as $name) { foreach ($this->append as $key => $name) {
if (is_array($name)) {
// 追加关联对象属性
$relation = $this->getAttr($key);
$item[$key] = $relation->append($name)->toArray();
} else {
$item[$name] = $this->getAttr($name); $item[$name] = $this->getAttr($name);
} }
} }
}
return !empty($item) ? $item : []; return !empty($item) ? $item : [];
} }