hasMay(first:related,foreignKey,localKey)
三个参数一个是关联模型类,需要传递完整路径,外键(传递模型的表中),自己的主键
function tap($value, $callback = null)
{
//是否具有回调函数,无则返回HigherOrderTapProxy类的实例化
if (is_null($callback)) {
return new HigherOrderTapProxy($value);
}
//
$callback($value);
return $value;
}
//回调函数
function ($instance)
{
if (! $instance->getConnectionName()) {
$instance->setConnection($this->connection);
}
}
public function hasMany($related, $foreignKey = null, $localKey = null)
{
//实例化表的连接
$instance = $this->newRelatedInstance($related);
//获取外键,默认 表名加“_id”
$foreignKey = $foreignKey ?: $this->getForeignKey();
//获取自己表的相应键,默认id
$localKey = $localKey ?: $this->getKeyName();
return $this->newHasMany(
$instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey
);
}
protected function newRelatedInstance($class)
{ //
return tap(new $class, function ($instance) {
if (! $instance->getConnectionName()) {
$instance->setConnection($this->connection);
}
});
}
class HigherOrderTapProxy
{
/**
* The target being tapped.
*
* @var mixed
*/
public $target;
/**
* Create a new tap proxy instance.
*
* @param mixed $target
* @return void
*/
public function __construct($target)
{
$this->target = $target;
}
/**
* Dynamically pass method calls to the target.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
$this->target->{$method}(...$parameters);
return $this->target;
}