[李景山php]每天laravel-20161201|BelongsToMany.php-4

发布时间:2020-04-06 20:33:57 作者:lijingsan1
来源:网络 阅读:538
    // 2016-09-23
    /**
     * Format the sync list so that it is keyed by ID.
     *
     * @param  array  $records
     * @return array
     */
    protected function formatSyncList(array $records)
    {//format the sync list so that it is keyed b ID.
        $results = [];// set return values

        foreach ($records as $id => $attributes) {// loop this records
            if (! is_array($attributes)) {// get ID and attributes
                list($id, $attributes) = [$attributes, []];
            }// set list

            $results[$id] = $attributes;
        }// //set the result by id throw the attributes

        return $results;
    }// return results

    /**
     * Attach all of the IDs that aren't in the current array.
     *
     * @param  array  $records
     * @param  array  $current
     * @param  bool   $touch
     * @return array
     */
    protected function attachNew(array $records, array $current, $touch = true)
    {// Attach all of the IDs that aren't in the current array.
        $changes = ['attached' => [], 'updated' => []];//set the changes

        foreach ($records as $id => $attributes) {// loop the records
            // If the ID is not in the list of existing pivot IDs, we will insert a new pivot
            // record, otherwise, we will just update this existing record on this joining
            // table, so that the developers will easily update these records pain free.
            if (! in_array($id, $current)) {// if this id not in the pivot group,just insert it.
                $this->attach($id, $attributes, $touch);

                $changes['attached'][] = is_numeric($id) ? (int) $id : (string) $id;
            }

            // Now we'll try to update an existing pivot record with the attributes that were
            // given to the method. If the model is actually updated we will add it to the
            // list of updated pivot records so we return them back out to the consumer.
            elseif (count($attributes) > 0 &&
                $this->updateExistingPivot($id, $attributes, $touch)) {
                $changes['updated'][] = is_numeric($id) ? (int) $id : (string) $id;
            }//we return them back out to the consumer.
        }

        return $changes;
    }

    /**
     * Update an existing pivot record on the table.
     *
     * @param  mixed  $id
     * @param  array  $attributes
     * @param  bool   $touch
     * @return int
     */
    public function updateExistingPivot($id, array $attributes, $touch = true)
    {// Update an existing pivot record on the table
        if (in_array($this->updatedAt(), $this->pivotColumns)) {
            $attributes = $this->setTimestampsOnAttach($attributes, true);
        }// in_array($this->updateAt)
       // set the attribute

        $updated = $this->newPivotStatementForId($id)->update($attributes);
// get this updated
        if ($touch) {
            $this->touchIfTouching();
        }// if need touch

        return $updated;
    }//return this result

    /**
     * Attach a model to the parent.
     *
     * @param  mixed  $id
     * @param  array  $attributes
     * @param  bool   $touch
     * @return void
     */
    public function attach($id, array $attributes = [], $touch = true)
    {
        if ($id instanceof Model) {
            $id = $id->getKey();
        }// case 1

        if ($id instanceof Collection) {
            $id = $id->modelKeys();
        }// case 2

        $query = $this->newPivotStatement();
// get the query
        $query->insert($this->createAttachRecords((array) $id, $attributes));
// insert the data
        if ($touch) {
            $this->touchIfTouching();
        }// touch something
    }// first to attach

    /**
     * Create an array of records to insert into the pivot table.
     *
     * @param  array  $ids
     * @param  array  $attributes
     * @return array
     */
    protected function createAttachRecords($ids, array $attributes)
    {//Create an array of records to insert into the pivot table.
        $records = [];// records

        $timed = ($this->hasPivotColumn($this->createdAt()) ||
                  $this->hasPivotColumn($this->updatedAt()));
// set timed
        // To create the p_w_upload records, we will simply spin through the IDs given
        // and create a new record to insert for each ID. Each ID may actually be a
        // key in the array, with extra attributes to be placed in other columns.
        foreach ($ids as $key => $value) {
            $records[] = $this->attacher($key, $value, $attributes, $timed);
        }// get records by id and other relation columns

        return $records;
    }// return this records

    /**
     * Create a full p_w_upload record payload.
     *
     * @param  int    $key
     * @param  mixed  $value
     * @param  array  $attributes
     * @param  bool   $timed
     * @return array
     */
    protected function attacher($key, $value, $attributes, $timed)
    {//Create a full p_w_upload record payload
        list($id, $extra) = $this->getAttachId($key, $value, $attributes);// list many return

        // To create the p_w_upload records, we will simply spin through the IDs given
        // and create a new record to insert for each ID. Each ID may actually be a
        // key in the array, with extra attributes to be placed in other columns.
        $record = $this->createAttachRecord($id, $timed);// id is a key about every thing

        return array_merge($record, $extra);
    }//return this array_merge.

    /**
     * Get the attach record ID and extra attributes.
     *
     * @param  mixed  $key
     * @param  mixed  $value
     * @param  array  $attributes
     * @return array
     */
    protected function getAttachId($key, $value, array $attributes)
    {//Get the attach record ID and extra attributes.
        if (is_array($value)) {
            return [$key, array_merge($value, $attributes)];
        }// a strange thing

        return [$value, $attributes];
    }// return this default

    /**
     * Create a new pivot p_w_upload record.
     *
     * @param  int   $id
     * @param  bool  $timed
     * @return array
     */
    protected function createAttachRecord($id, $timed)
    {//Create a new pivot p_w_upload record
        $record[$this->foreignKey] = $this->parent->getKey();// record the key

        $record[$this->otherKey] = $id;//record the other key

        // If the record needs to have creation and update timestamps, we will make
        // them by calling the parent model's "freshTimestamp" method which will
        // provide us with a fresh timestamp in this model's preferred format.
        if ($timed) {
            $record = $this->setTimestampsOnAttach($record);
        }// if you need to update this timestamps,just use parents method

        return $record;
    }//return record

    /**
     * Set the creation and update timestamps on an attach record.
     *
     * @param  array  $record
     * @param  bool   $exists
     * @return array
     */
    protected function setTimestampsOnAttach(array $record, $exists = false)
    {// this function just try to use father method to set about timestamps
        $fresh = $this->parent->freshTimestamp();// get this function return

        if (! $exists && $this->hasPivotColumn($this->createdAt())) {
            $record[$this->createdAt()] = $fresh;
        }// check some condition

        if ($this->hasPivotColumn($this->updatedAt())) {
            $record[$this->updatedAt()] = $fresh;
        }// ok

        return $record;
    }//return this record

    /**
     * Detach models from the relationship.
     *
     * @param  int|array  $ids
     * @param  bool  $touch
     * @return int
     */
    public function detach($ids = [], $touch = true)
    {// detach models from the relationship
        if ($ids instanceof Model) {
            $ids = (array) $ids->getKey();// ids = (array) -> ids-> getKey
        }// ids instanceof Model

        $query = $this->newPivotQuery();//get a new query

        // If associated IDs were passed to the method we will only delete those
        // associations, otherwise all of the association ties will be broken.
        // We'll return the numbers of affected rows when we do the deletes.
        $ids = (array) $ids;// first to set the ids

        if (count($ids) > 0) {
            $query->whereIn($this->otherKey, (array) $ids);
        }// count the query

        // Once we have all of the conditions set on the statement, we are ready
        // to run the delete on the pivot table. Then, if the touch parameter
        // is true, we will go ahead and touch all related models to sync.
        $results = $query->delete();//Once we have all of the conditions on the statement
        //are ready to run the delete on the pivot table.

        if ($touch) {
            $this->touchIfTouching();
        }

        return $results;
    }//just return this results

    /**
     * If we're touching the parent model, touch.
     *
     * @return void
     */
    public function touchIfTouching()
    {
        if ($this->touchingParent()) {
            $this->getParent()->touch();
        }

        if ($this->getParent()->touches($this->relationName)) {
            $this->touch();
        }
    }//If we're touching the parent model,touch.

    /**
     * Determine if we should touch the parent on sync.
     *
     * @return bool
     */
    protected function touchingParent()
    {
        return $this->getRelated()->touches($this->guessInverseRelation());
    }//Determine if we should touch the parent on sync.

    /**
     * Attempt to guess the name of the inverse of the relation.
     *
     * @return string
     */
    protected function guessInverseRelation()
    {
        return Str::camel(Str::plural(class_basename($this->getParent())));
    }//Attempt to guess the name of the inverse of the relation

    /**
     * Create a new query builder for the pivot table.
     *
     * @return \Illuminate\Database\Query\Builder
     */
    protected function newPivotQuery()
    {//Create a new query builder for the pivot table
        $query = $this->newPivotStatement();

        foreach ($this->pivotWheres as $whereArgs) {
            call_user_func_array([$query, 'where'], $whereArgs);
        }

        return $query->where($this->foreignKey, $this->parent->getKey());
    }// just a wrap function

    /**
     * Get a new plain query builder for the pivot table.
     *
     * @return \Illuminate\Database\Query\Builder
     */
    public function newPivotStatement()
    {
        return $this->query->getQuery()->newQuery()->from($this->table);
    }// Get a new plain query builder for the pivot table

    /**
     * Get a new pivot statement for a given "other" ID.
     *
     * @param  mixed  $id
     * @return \Illuminate\Database\Query\Builder
     */
    public function newPivotStatementForId($id)
    {
        return $this->newPivotQuery()->where($this->otherKey, $id);
    }//Get a new pivot statement for a given "other" ID.

    /**
     * Create a new pivot model instance.
     *
     * @param  array  $attributes
     * @param  bool   $exists
     * @return \Illuminate\Database\Eloquent\Relations\Pivot
     */
    public function newPivot(array $attributes = [], $exists = false)
    {
        $pivot = $this->related->newPivot($this->parent, $attributes, $this->table, $exists);

        return $pivot->setPivotKeys($this->foreignKey, $this->otherKey);
    }//Create a new pivot model instance.
   // return set Pivot Keys

    /**
     * Create a new existing pivot model instance.
     *
     * @param  array  $attributes
     * @return \Illuminate\Database\Eloquent\Relations\Pivot
     */
    public function newExistingPivot(array $attributes = [])
    {
        return $this->newPivot($attributes, true);
    }//Create a new existing pivot model instance.

    /**
     * Set the columns on the pivot table to retrieve.
     *
     * @param  array|mixed  $columns
     * @return $this
     */
    public function withPivot($columns)
    {
        $columns = is_array($columns) ? $columns : func_get_args();// set this columns.

        $this->pivotColumns = array_merge($this->pivotColumns, $columns);// pivot array_merge

        return $this;
    }// Set the columns on the pivot table to retrieve.

    /**
     * Specify that the pivot table has creation and update timestamps.
     *
     * @param  mixed  $createdAt
     * @param  mixed  $updatedAt
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function withTimestamps($createdAt = null, $updatedAt = null)
    {
        $this->pivotCreatedAt = $createdAt;// set user
        $this->pivotUpdatedAt = $updatedAt;// set user

        return $this->withPivot($this->createdAt(), $this->updatedAt());
    }// Specify that the pivot table has creation and update timestamps

    /**
     * Get the name of the "created at" column.
     *
     * @return string
     */
    public function createdAt()
    {
        return $this->pivotCreatedAt ?: $this->parent->getCreatedAtColumn();
    }// Get the name of the "created at" column

    /**
     * Get the name of the "updated at" column.
     *
     * @return string
     */
    public function updatedAt()
    {
        return $this->pivotUpdatedAt ?: $this->parent->getUpdatedAtColumn();
    }// pivot

    /**
     * Get the related model's updated at column name.
     *
     * @return string
     */
    public function getRelatedFreshUpdate()
    {
        return [$this->related->getUpdatedAtColumn() => $this->related->freshTimestamp()];
    }// just return

    /**
     * Get the key for comparing against the parent key in "has" query.
     *
     * @return string
     */
    public function getHasCompareKey()
    {
        return $this->getForeignKey();
    }//return

    /**
     * Get the fully qualified foreign key for the relation.
     *
     * @return string
     */
    public function getForeignKey()
    {
        return $this->table.'.'.$this->foreignKey;
    }//return

    /**
     * Get the fully qualified "other key" for the relation.
     *
     * @return string
     */
    public function getOtherKey()
    {
        return $this->table.'.'.$this->otherKey;
    }//return

    /**
     * Get the intermediate table for the relationship.
     *
     * @return string
     */
    public function getTable()
    {
        return $this->table;
    }//return

    /**
     * Get the relationship name for the relationship.
     *
     * @return string
     */
    public function getRelationName()
    {
        return $this->relationName;
    }//return
}


推荐阅读:
  1. vuejs+element-ui+laravel5.4上传文件的示例代码
  2. JS中怎样实现Laravel的route函数

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

laravel tomany

上一篇:centos6.5 安装rabbitMQ3.6.6

下一篇:2014年前端开发者如何提升自己

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》