laravel源码之Eloquent之hasMay(first:related,foreignKey,localKey)

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;
    }

 

你可能感兴趣的:(laravel)