|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace think\model; |
|
|
|
|
|
use think\db\Query; |
|
|
use think\Exception; |
|
|
use think\Model; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract class Relation |
|
|
{ |
|
|
|
|
|
protected $parent; |
|
|
|
|
|
protected $model; |
|
|
|
|
|
protected $query; |
|
|
|
|
|
protected $foreignKey; |
|
|
|
|
|
protected $localKey; |
|
|
|
|
|
protected $baseQuery; |
|
|
|
|
|
protected $selfRelation; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getParent() |
|
|
{ |
|
|
return $this->parent; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getModel() |
|
|
{ |
|
|
return $this->query->getModel(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getQuery() |
|
|
{ |
|
|
return $this->query; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function selfRelation($self = true) |
|
|
{ |
|
|
$this->selfRelation = $self; |
|
|
return $this; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function isSelfRelation() |
|
|
{ |
|
|
return $this->selfRelation; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function resultSetBuild($resultSet) |
|
|
{ |
|
|
return (new $this->model)->toCollection($resultSet); |
|
|
} |
|
|
|
|
|
protected function getQueryFields($model) |
|
|
{ |
|
|
$fields = $this->query->getOptions('field'); |
|
|
return $this->getRelationQueryFields($fields, $model); |
|
|
} |
|
|
|
|
|
protected function getRelationQueryFields($fields, $model) |
|
|
{ |
|
|
if ($fields) { |
|
|
|
|
|
if (is_string($fields)) { |
|
|
$fields = explode(',', $fields); |
|
|
} |
|
|
|
|
|
foreach ($fields as &$field) { |
|
|
if (false === strpos($field, '.')) { |
|
|
$field = $model . '.' . $field; |
|
|
} |
|
|
} |
|
|
} else { |
|
|
$fields = $model . '.*'; |
|
|
} |
|
|
|
|
|
return $fields; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function baseQuery() |
|
|
{} |
|
|
|
|
|
public function __call($method, $args) |
|
|
{ |
|
|
if ($this->query) { |
|
|
|
|
|
$this->baseQuery(); |
|
|
|
|
|
$result = call_user_func_array([$this->query, $method], $args); |
|
|
if ($result instanceof Query) { |
|
|
return $this; |
|
|
} else { |
|
|
$this->baseQuery = false; |
|
|
return $result; |
|
|
} |
|
|
} else { |
|
|
throw new Exception('method not exists:' . __CLASS__ . '->' . $method); |
|
|
} |
|
|
} |
|
|
} |
|
|
|