[李景山php]每天laravel-20161129|BelongsToMany.php-1

namespace Illuminate\Database\Eloquent\Relations;

use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\ModelNotFoundException;
// yesterday we just say this belongsTo
// today we just use this belongToMany
class BelongsToMany extends Relation
{// Belongs To Many just a relation
    /**
     * The intermediate table for the relation.
     *
     * @var string
     */
    protected $table; // the middle table , ha ha
   // intermediate: like middle ,
   // this is the intermediate table for the relation

    /**
     * The foreign key of the parent model.
     *
     * @var string
     */
    protected $foreignKey;// The foreign key of the parent model.

    /**
     * The associated key of the relation.
     *
     * @var string
     */
    protected $otherKey;// the relation key: like the associated key of the relation

    /**
     * The "name" of the relationship.
     *
     * @var string
     */
    protected $relationName;//The "name" of the relationship.

    /**
     * The pivot table columns to retrieve.
     *
     * @var array
     */
    protected $pivotColumns = [];//The pivot table columns to the retrieve
   // retrieve like: search,
   // this is main table columns to be search, or retrieve.

    /**
     * Any pivot table restrictions.
     *
     * @var array
     */
    protected $pivotWheres = [];// Any pivot table restrictions.
   // a pivot table array store about this be restrictions.

    /**
     * The custom pivot table column for the created_at timestamp.
     *
     * @var string
     */
    protected $pivotCreatedAt;// The custom pivot table column for the create_at timestamp.
   //The custom pivot table column
   // just for the created_at timestamp

    /**
     * The custom pivot table column for the updated_at timestamp.
     *
     * @var string
     */
    protected $pivotUpdatedAt;
   // The custom pivot table column
   // for updated_at timestamp.

    /**
     * Create a new belongs to many relationship instance.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  \Illuminate\Database\Eloquent\Model  $parent
     * @param  string  $table
     * @param  string  $foreignKey
     * @param  string  $otherKey
     * @param  string  $relationName
     * @return void
     */
    public function __construct(Builder $query, Model $parent, $table, $foreignKey, $otherKey, $relationName = null)
    {//Create a new belongs to many relationship instance.
        $this->table = $table;// set table
        $this->otherKey = $otherKey;// set the other Key
        $this->foreignKey = $foreignKey;//set foreignKey
        $this->relationName = $relationName;//set relationName

        parent::__construct($query, $parent);// use parent construct function
    }

    /**
     * Get the results of the relationship.
     *
     * @return mixed
     */
    public function getResults()
    {
        return $this->get();
    }// Get the result of the relationship.
   // just a get result

    /**
     * Set a where clause for a pivot table column.
     *
     * @param  string  $column
     * @param  string  $operator
     * @param  mixed   $value
     * @param  string  $boolean
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function wherePivot($column, $operator = null, $value = null, $boolean = ‘and‘)
    {//Set a where clause for a pivot table column.
        $this->pivotWheres[] = func_get_args();// this pivotWheres get args

        return $this->where($this->table.‘.‘.$column, $operator, $value, $boolean);
    }// just where

    /**
     * Set an or where clause for a pivot table column.
     *
     * @param  string  $column
     * @param  string  $operator
     * @param  mixed   $value
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function orWherePivot($column, $operator = null, $value = null)
    {
        return $this->wherePivot($column, $operator, $value, ‘or‘);
    }// set clause in or where
   // just a wrap function with the wherePivot

    /**
     * Execute the query and get the first result.
     *
     * @param  array   $columns
     * @return mixed
     */
    public function first($columns = [‘*‘])
    {
        $results = $this->take(1)->get($columns);// get the first result

        return count($results) > 0 ? $results->first() : null;// get the first result
    }//execute like fire: the query and get the first result.

    /**
     * Execute the query and get the first result or throw an exception.
     *
     * @param  array  $columns
     * @return \Illuminate\Database\Eloquent\Model|static
     *
     * @throws \Illuminate\Database\Eloquent\ModelNotFoundException
     */
    public function firstOrFail($columns = [‘*‘])
    {// first or fail
        if (! is_null($model = $this->first($columns))) {
            return $model;
        }// has this first result ,just return it
// other throw new exception
        throw new ModelNotFoundException;
    }

    /**
     * Execute the query as a "select" statement.
     *
     * @param  array  $columns
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function get($columns = [‘*‘])
    {// Execute the query as a "select" statement.

        // First we‘ll add the proper select columns onto the query so it is run with
        // the proper columns. Then, we will get the results and hydrate out pivot
        // models with the result of those columns as a separate model relation.
        $columns = $this->query->getQuery()->columns ? [] : $columns;
//First we‘ll add the proper select columns onto the query so it is run with the proper columns.
       //Then ,we will get the results and hydrate out pivot models with the result of those
       //columns as a separate model relation.
        $select = $this->getSelectColumns($columns);// get the select columns

        $builder = $this->query->applyScopes();// apply Scopes ,fire to builder

        $models = $builder->addSelect($select)->getModels();// get models

        $this->hydratePivotRelation($models);// hydrate Pivot Relation

        // If we actually found models we will also eager load any relationships that
        // have been specified as needing to be eager loaded. This will solve the
        // n + 1 query problem for the developer and also increase performance.
        if (count($models) > 0) {
            $models = $builder->eagerLoadRelations($models);
        }//loader other developer

        return $this->related->newCollection($models);// make a new collection
    }

    /**
     * Get a paginator for the "select" statement.
     *
     * @param  int  $perPage
     * @param  array  $columns
     * @param  string  $pageName
     * @param  int|null  $page
     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
     */
    public function paginate($perPage = null, $columns = [‘*‘], $pageName = ‘page‘, $page = null)
    {//Get a paginator for the "select" statement.
        $this->query->addSelect($this->getSelectColumns($columns));
// add select columns for this query
        $paginator = $this->query->paginate($perPage, $columns, $pageName, $page);
// set the paginate
        $this->hydratePivotRelation($paginator->items());
// hydrate Pivot Relation
        return $paginator;
    }

    /**
     * Paginate the given query into a simple paginator.
     *
     * @param  int  $perPage
     * @param  array  $columns
     * @param  string  $pageName
     * @return \Illuminate\Contracts\Pagination\Paginator
     */
    public function simplePaginate($perPage = null, $columns = [‘*‘], $pageName = ‘page‘)
    {//Paginate the given query into a simple paginator.
        $this->query->addSelect($this->getSelectColumns($columns));
// set select
        $paginator = $this->query->simplePaginate($perPage, $columns, $pageName);
// get the simple Paginate
        $this->hydratePivotRelation($paginator->items());
// hydrate Relation the result
        return $paginator;
    }//return result

    /**
     * Chunk the results of the query.
     *
     * @param  int  $count
     * @param  callable  $callback
     * @return bool
     */
    public function chunk($count, callable $callback)
    {//Chunk the results of the query.
        $this->query->addSelect($this->getSelectColumns());
// query addSelect  get Select Columns
        return $this->query->chunk($count, function ($results) use ($callback) {
            $this->hydratePivotRelation($results->all());

            return $callback($results);
        });// return the chunk
    }

    /**
     * Hydrate the pivot table relationship on the models.
     *
     * @param  array  $models
     * @return void
     */
    protected function hydratePivotRelation(array $models)
    {//Hydrate the pivot table relationship on the models.

        // To hydrate the pivot relationship, we will just gather the pivot attributes
        // and create a new Pivot model, which is basically a dynamic model that we
        // will set the attributes, table, and connections on so it they be used.
        foreach ($models as $model) {
            $pivot = $this->newExistingPivot($this->cleanPivotAttributes($model));

            $model->setRelation(‘pivot‘, $pivot);
        }// loop this models
       // and set the pivot about this model
    }
时间: 2024-10-11 17:25:15

[李景山php]每天laravel-20161129|BelongsToMany.php-1的相关文章

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

    /**      * 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 mode

[李景山php]每天laravel-20161131|BelongsToMany.php-3

    /**      * Save a new model and attach it to the parent model.      *      * @param  \Illuminate\Database\Eloquent\Model  $model      * @param  array  $joining      * @param  bool   $touch      * @return \Illuminate\Database\Eloquent\Model      *

[李景山php]每天TP5-20170115|thinkphp5-Model.php-8

    /**      * 预载入关联查询 返回模型对象      * @access public      * @param Model     $result 数据对象      * @param string    $relation 关联名      * @return Model      */     public function eagerlyResult($result, $relation)     {         return $this->relation()->

[李景山php]每天laravel-20160920|Writer-2

    //2016-07-20     /**      * Register a file log handler.      *      * @param  string  $path      * @param  string  $level      * @return void      */     public function useFiles($path, $level = 'debug')     {         $this->monolog->pushHandle

[李景山php]每天laravel-20161021|Request.php-2

/**  * Determine if the current request URL and query string matches a pattern.  *  * @param  mixed  string  * @return bool  */ public function fullUrlIs() {// check string like URL     $url = $this->fullUrl();     foreach (func_get_args() as $patter

[李景山php]每天laravel-20161103|CompilerEngine.php-2

    /**      * Handle a view exception.      *      * @param  \Exception  $e      * @param  int  $obLevel      * @return void      *      * @throws $e      */     protected function handleViewException(Exception $e, $obLevel)     {         $e = new E

[李景山php]每天laravel-20161104|Engine.php

<?php namespace Illuminate\View\Engines; abstract class Engine {     /**      * The view that was last to be rendered.      *      * @var string      */     protected $lastRendered;//The view that was last to be rendered.     /**      * Get the last 

[李景山php]每天laravel-20161105|EngineInterface.php

<?php namespace Illuminate\View\Engines; interface EngineInterface {     /**      * Get the evaluated contents of the view.      *      * @param  string  $path      * @param  array   $data      * @return string      */     public function get($path, 

[李景山php]每天laravel-20161106|EngineResolver.php

<?php namespace Illuminate\View\Engines; use Closure; use InvalidArgumentException; class EngineResolver {// engineResolver     /**      * The array of engine resolvers.      *      * @var array      */     protected $resolvers = [];// The array of e