[李景山php]每天laravel-20161130|BelongsToMany.php-2

来源:互联网 发布:平舆在线软件下载 编辑:程序博客网 时间:2024/05/29 16:58
    /**     * Get the pivot attributes from a model.     *     * @param  \Illuminate\Database\Eloquent\Model  $model     * @return array     */    protected function cleanPivotAttributes(Model $model)    {//Get the pivot attributes from a model        $values = [];// set the store values        foreach ($model->getAttributes() as $key => $value) {// loop attributes            // To get the pivots attributes we will just take any of the attributes which            // begin with "pivot_" and add those to this arrays, as well as unsetting            // them from the parent's models since they exist in a different table.            if (strpos($key, 'pivot_') === 0) {// if has this pivot_* key,                $values[substr($key, 6)] = $value;// dump the value in target array                unset($model->$key);// unset the source            }        }        return $values;// return this result    }    /**     * Set the base constraints on the relation query.     *     * @return void     */    public function addConstraints()    {//Set the base constraints on the relation query.        $this->setJoin();// first to set Join// set Constraints        if (static::$constraints) {// if has this flag then set Where            $this->setWhere();        }    }    /**     * Add the constraints for a relationship query.     *     * @param  \Illuminate\Database\Eloquent\Builder  $query     * @param  \Illuminate\Database\Eloquent\Builder  $parent     * @param  array|mixed  $columns     * @return \Illuminate\Database\Eloquent\Builder     */    public function getRelationQuery(Builder $query, Builder $parent, $columns = ['*'])    {//Add the constraints for a relationship query.        if ($parent->getQuery()->from == $query->getQuery()->from) {            return $this->getRelationQueryForSelfJoin($query, $parent, $columns);        }// if same the parent with this class self        // return the getRelation Query For Self Join        $this->setJoin($query);//setJoin        return parent::getRelationQuery($query, $parent, $columns);// just Relation Query    }// default use parents function    /**     * Add the constraints for a relationship query on the same table.     *     * @param  \Illuminate\Database\Eloquent\Builder  $query     * @param  \Illuminate\Database\Eloquent\Builder  $parent     * @param  array|mixed  $columns     * @return \Illuminate\Database\Eloquent\Builder     */    public function getRelationQueryForSelfJoin(Builder $query, Builder $parent, $columns = ['*'])    {//Add the constraints for a relationship query on the same table.        $query->select($columns);// first set select        $query->from($this->related->getTable().' as '.$hash = $this->getRelationCountHash());//set from        $this->related->setTable($hash);// set table        $this->setJoin($query);// set Join        return parent::getRelationQuery($query, $parent, $columns);    }// then use the GetRelationQuery    /**     * Get a relationship join table hash.     *     * @return string     */    public function getRelationCountHash()    {        return 'self_'.md5(microtime(true));    }// get the hash key    /**     * Set the select clause for the relation query.     *     * @param  array  $columns     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany     */    protected function getSelectColumns(array $columns = ['*'])    {//Set the select clause  for the relation query.        // clause like constraints like this html tag list, yeah        if ($columns == ['*']) {            $columns = [$this->related->getTable().'.*'];        }// if this * options ,so we will get all table        return array_merge($columns, $this->getAliasedPivotColumns());    }// return this columns with the origin columns options    // even the  alias , so it is every import    /**     * Get the pivot columns for the relation.     *     * @return array     */    protected function getAliasedPivotColumns()    {//Get the pivot columns for the relation        $defaults = [$this->foreignKey, $this->otherKey];// first we set the defaults        // We need to alias all of the pivot columns with the "pivot_" prefix so we        // can easily extract them out of the models and put them into the pivot        // relationships when they are retrieved and hydrated into the models.        $columns = [];// retrieved like cover;        //columns : be prepare for the columns        foreach (array_merge($defaults, $this->pivotColumns) as $column) {// loop source as column            $columns[] = $this->table.'.'.$column.' as pivot_'.$column;        }// set the columns        return array_unique($columns);    }// return the unique key array    /**     * Determine whether the given column is defined as a pivot column.     *     * @param  string  $column     * @return bool     */    protected function hasPivotColumn($column)    {//Determine whether the given column is defined as a pivot column        return in_array($column, $this->pivotColumns);    }// a system function be wrap by a package function    /**     * Set the join clause for the relation query.     *     * @param  \Illuminate\Database\Eloquent\Builder|null  $query     * @return $this     */    protected function setJoin($query = null)    {// Set the join clause for the relation query        $query = $query ?: $this->query;// first to set the query sql        // We need to join to the intermediate table on the related model's primary        // key column with the intermediate table's foreign key for the related        // model instance. Then we can set the "where" for the parent models.        $baseTable = $this->related->getTable();        // inter mediate like middle        // get the base Table        $key = $baseTable.'.'.$this->related->getKeyName();// set key        $query->join($this->table, $key, '=', $this->getOtherKey());        return $this;// return this class query    }    /**     * Set the where clause for the relation query.     *     * @return $this     */    protected function setWhere()    {//Set the where clause for the relation query.        $foreign = $this->getForeignKey();// first get the foregin        $this->query->where($foreign, '=', $this->parent->getKey());// set the where sql query        return $this;    }// return the query    /**     * Set the constraints for an eager load of the relation.     *     * @param  array  $models     * @return void     */    public function addEagerConstraints(array $models)    {// add Eager Constraints        $this->query->whereIn($this->getForeignKey(), $this->getKeys($models));// wrap this function with whereIn    }//Set the constraints for an eager load of the relation    /**     * Initialize the relation on a set of models.     *     * @param  array   $models     * @param  string  $relation     * @return array     */    public function initRelation(array $models, $relation)    {//Initialize the relation on a set of models        foreach ($models as $model) {            $model->setRelation($relation, $this->related->newCollection());        }// loop it and set the Relation        return $models;    }// return this models family    /**     * Match the eagerly loaded results to their parents.     *     * @param  array   $models     * @param  \Illuminate\Database\Eloquent\Collection  $results     * @param  string  $relation     * @return array     */    public function match(array $models, Collection $results, $relation)    {//Match the eagerly loaded results to their parents        $dictionary = $this->buildDictionary($results);// set the dictionary be build Dictionary        // Once we have an array dictionary of child objects we can easily match the        // children back to their parent using the dictionary and the keys on the        // the parent models. Then we will return the hydrated models back out.        foreach ($models as $model) {//loop all values by this dictionary            if (isset($dictionary[$key = $model->getKey()])) {                $collection = $this->related->newCollection($dictionary[$key]);                $model->setRelation($relation, $collection);            }        }        return $models;// return the models    }    /**     * Build model dictionary keyed by the relation's foreign key.     *     * @param  \Illuminate\Database\Eloquent\Collection  $results     * @return array     */    protected function buildDictionary(Collection $results)    {//Build model dictionary keyed by the relation foreign key        $foreign = $this->foreignKey;// just use self key        // First we will build a dictionary of child models keyed by the foreign key        // of the relation so that we will easily and quickly match them to their        // parents without having a possibly slow inner loops for every models.        $dictionary = [];// build a dictionary        foreach ($results as $result) {            $dictionary[$result->pivot->$foreign][] = $result;        }// set this        return $dictionary;    }// return the dictionary    /**     * Touch all of the related models for the relationship.     *     * E.g.: Touch all roles associated with this user.     *     * @return void     */    public function touch()    {// associated : like relation        // touch is a order in linux system        $key = $this->getRelated()->getKeyName();// set the ke        $columns = $this->getRelatedFreshUpdate();// set or even get the columns        // If we actually have IDs for the relation, we will run the query to update all        // the related model's timestamps, to make sure these all reflect the changes        // to the parent models. This will help us keep any caching synced up here.        $ids = $this->getRelatedIds();// get ids// caching synced        if (count($ids) > 0) {            $this->getRelated()->newQuery()->whereIn($key, $ids)->update($columns);        }// count the get Related    }    /**     * Get all of the IDs for the related models.     *     * @return \Illuminate\Support\Collection     */    public function getRelatedIds()    {// Get all of the IDs for the related models        $related = $this->getRelated();// related        $fullKey = $related->getQualifiedKeyName();// set fullkey        return $this->getQuery()->select($fullKey)->pluck($related->getKeyName());    }// get Query
0 0
原创粉丝点击