澳门威利斯人_威利斯人娱乐「手机版」

来自 威利斯人娱乐 2020-01-27 02:46 的文章
当前位置: 澳门威利斯人 > 威利斯人娱乐 > 正文

Eloquent演化历程1,Eloquent演化历程2

public function __call($method, $parameters){ if (method_exists($this->query, $method)) { return call_user_func_array(array($this->query, $method), $parameters); } throw new BadMethodCallException("Method [$method] does not exist.");}

数据库迁移

让我们先看目录布局:

src/Illuminate/Database/Console
└── Migrations
    ├── MigrateCommand.php
    ├── MigrationRepositoryInterface.php
    └── Migrator.php

此处有个新的知识点,也是laravel中一大亮点Artisan,Artisan是 Laravel 自带的下令行接口名称,此处不抓牢际的介绍了,有机遇再细说的,当大家在指令行中实施php artisan command的时候,会去调用migrateCommand,然后最后会调用Migrator中的函数runMigrations函数,看上边解析:

public function runMigrations(OuputInterface $output, $package, $path, $pretend = false)
{
  $this->output->writeln('<info>Running migrations at path: '.$path.'</info>');

  // 从文件中获取migrate files
  $files = $this->getMigrationFiles($path);
  // 获取已经执行的migration
  $ran = $this->repository->getRanMigrations($package);
  // 比较不同
  $migrations = array_diff($files, $ran);
 // 执行未执行的migration
  $this->runMigrationList($output, $migrations, $package, $pretend);
}
  1. 负有的中级方法如 'where' 等都能够同一时候扶植 '静态' 和 '非静态链式' 三种艺术调用,即 'Article::where(卡塔尔国...' 和 'Article::....->where(State of Qatar'。

  2. 不无的 '非固定用法' 的调用最后都须要叁个操作来 '收尾',本片教程中有四个 '收尾操作':'->get'。

能够看来属性通过定义table,connection,将现实的数据库操作是信托给了connection类,然后Model自身是承担领域逻辑,同一时间会定义一些静态方法,如create,find,save,充当了Row Data Gateway剧中人物,这个时候的类图如下:

大版本前夜

看完上边的最宗旨版本的migrator,大家赶过下直接来看tag v1.1.1版本的eloquent,

git co v1.1.1

此版本是v4.0.0从前的二个本子,从那以往laravel会以组件的样式组织各类职能,让我们分析下v1.1.1的本子,方今具备啥等职能,都以怎么贯彻的,先看下目录构造:

图片 1

分别介绍下:

Console和Migrations:这是本篇讲migrations or database modification logic的功能

Eloquent:是前朝气蓬勃篇讲的对于Active Record情势中Model的成效,包括了Model、Builder和Relation成效,忘记的能够去看前豆蔻年华篇orm 体系 之 Eloquent蜕变历程1的内容

Query:包涵了最基本的Sql的操作和语法逻辑,相似于自定义了二个DSL语言,提供了面向对象的操作办法

Schema:那也是本篇讲migrations or database modification logic的法力,首若是对数码库表操作sql的建立模型

此处Connectors是以前从没介绍过的,Connectors是在f917efa中首先次参与的,大家看下到底做了怎么,其目录布局是:

src/Illuminate/Database/Connectors
├── ConnectionFactory.php
├── Connector.php
├── ConnectorInterface.php
├── MySqlConnector.php
├── PostgresConnector.php
├── SQLiteConnector.php
└── SqlServerConnector.php

看名字大家就领悟大约是怎么回事了,ConnectorInterface概念了接口,Connector是基类,ConnectionFactory是工厂情势,负勒令立具体的Connectors,再看下Connector文件,里面有个函数叫:

public function createConnection($dsn, array $config, array $options)
{
  $username = array_get($config, 'username');

  $password = array_get($config, 'password');

  return new PDO($dsn, $username, $password, $options);
}

实在正是对创设PDO的包裹,随着代码复杂度的抓实,我们根据SOLID原则(SOLID原则得以看The Clean Architecture in PHP 读书笔记(三卡塔尔(قطر‎),将创制PDO那有的效果与利益独立分离出来,变为了Connectors,然后依据SOLID原则,大家再持续看下ConnectionInterfaceConnectionResolverInterface,分别担任的机能能够看下图:

图片 2

图片 3

我们得以看见ConnectionInterface负责数据库的操作,ConnectionResolverInterface担任connection的军事拘押,原先这么些意义在稍早的本子中都是揉在同步的,依旧特别观点:

搭飞机项目复杂度的升官,我们根据关注点抽离的条件,不断去对系统做解耦职业

追寻标题为“作者是标题”的稿子,并打字与印刷 id

图片 4

新扩大功效

大家跟着本篇伊始介绍的migrate成效,来看下v1.1.0版本中有的职能,

src/Illuminate/Database/Console
├── Migrations
│   ├── BaseCommand.php
│   ├── InstallCommand.php
│   ├── MakeCommand.php
│   ├── MigrateCommand.php
│   ├── RefreshCommand.php
│   ├── ResetCommand.php
│   └── RollbackCommand.php
└── SeedCommand.php

那会儿Migrations目录下都是永葆的吩咐,而Migrations下边是现实性的贯彻了。

src/Illuminate/Database/Migrations
├── DatabaseMigrationRepository.php
├── Migration.php
├── MigrationCreator.php
├── MigrationRepositoryInterface.php
├── Migrator.php
└── stubs
    ├── blank.php
    ├── create.php
    └── update.php

作者们能够看出Eloquent中随地都以接口,接口定义了要满足的合同,互相之间都过接口沟通,最大的开展领悟耦。

咱们通过三个比较有趣的指令Make来看下migration的兑现,make的效能是新建贰个migration文件,其会依靠指令函数参数,去读取src/Illuminate/Database/Migrations/stubs上面包车型大巴3个文本中的一个,然后调用上边包车型客车函数

protected function populateStub($name, $stub, $table)
{
  $stub = str_replace('{{class}}', camel_case($name), $stub);

  // Here we will replace the table place-holders with the table specified by
  // the developer. This is useful for quickly creaeting a tables creation
  // or update migration from the console instead of typing it manually
  if ( ! is_null($table))
  {
    $stub = str_replace('{{table}}', $table, $stub);
  }

  return $stub;
}

做二个回顾的字符串替换,然后产生文书,然后还应该有多个比较风趣的是DatabaseMigrationRepository类,其职能是:我们必要记录migration哪些已经做了,哪些还还未做,这一个记录方式我们经过DatabaseMigrationRepository来兑现,最后是通过将实践记录以log的花样插入到数据库中。

本文最终讲下Eloquent中新添的目的时期的关联:多态关系,以下内容摘自[ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系

表结构

多态关联允许三个模型在单个关联下归于多个不相同模型。比如,倘若应用顾客不仅能对文章进行议论也足以对录像打开评价,使用多态关联,你能够在这里三种意况下使用单个comments表,首先,让大家看看营造这种涉及关系要求的表布局:

posts
id - integer
title - string
    body - text

videos
  id - integer
  title - string
  url - string

comments
    id - integer
    body - text
    commentable_id - integer
    commentable_type - string

八个基本点的内需潜心的列是 comments 表上的 commentable_idcommentable_typecommentable_id列对应 PostVideo 的 ID 值,而 commentable_type 列对应所属模型的类名。当访谈 commentable 关联时,ORM 根据commentable_type 字段来判别所属模型的档案的次序并回到相应模型实例。

模型布局

接下去,让大家看看创设这种关系关系需求在模型中定义什么:

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Comment extends Model
{
    /**
     * Get all of the owning commentable models.
     */
    public function commentable()
    {
        return $this->morphTo();
    }
}

class Post extends Model
{
    /**
     * Get all of the post's comments.
     */
    public function comments()
    {
        return $this->morphMany('AppComment', 'commentable');
    }
}

class Video extends Model
{
    /**
     * Get all of the video's comments.
     */
    public function comments()
    {
        return $this->morphMany('AppComment', 'commentable');
    }
}

如上内容来自[ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系,接下去让大家看下那是怎么落到实处的?

首先是morphMany的构造函数:

public function __construct(Builder $query, Model $parent, $morphName)
{
    $this->morphType = "{$morphName}_type";

    $this->morphClass = get_class($parent);

    parent::__construct($query, $parent, "{$morphName}_id");
}

然后morphMany骨子里是扩充是HasOneOrMany,然后再加限定的时候,新增添了三个$this->query->where($this->morphType, $this->morphClass);,通过那一个范围就能够解决多态关联了,那上边的例证来讲,正是五个典型化commentable_type=Video,至于HasOneOrMany的分析参谋上黄金年代篇小说。

以上正是v4.0.0早先的Eloquent的大概成效,前段时间orm成效已经完美了,数据库迁移效用,Active Record情势的落到实处,下一步Eloquent的大方向是哪些吗?让我们随后git继续追踪吧_

若是大家有五个模型:User 和 Account,分别对应注册客商和消费者,他们是风姿浪漫对朝气蓬勃的涉嫌,那么风流倜傥旦大家要使用 Eloquent 提供的风度翩翩对黄金年代关乎方法,表布局应当是这么的:

├── Builder.php├── Model.php└── Relations ├── BelongsTo.php ├── BelongsToMany.php ├── HasMany.php ├── HasOne.php ├── HasOneOrMany.php └── Relation.php

正文是orm类别的第三篇,也是Eloquent演变的第二篇,Eloquent连串会尝试着讲清楚Eloquent是如何一步一步衍生和变化到当前作用强盛的版本的,不过到底个人力量轻松,非常小概解析的特别全面,总会有不懂的地点,所以讲的失实之处,恳请大牌们能多多点拨;或然只要有啥样位置是没看懂的,也请提议来,因为可能那地点正是本人本身没看懂,所以没申明白,你建议后大家就能够合营谈谈,让我们能一齐的升华的。

查询出全部小说并循环打字与印刷出具备标题

Eloquent是laravel中的orm,选取的是active record的设计方式,里面包车型客车对象不仅仅囊括世界逻辑,还包括了数据库操作,不过我们平时接纳的时候可能未有研讨eloquent是怎么规划的,active record这种形式的得失等主题材料,下边作者会带领大家从头伊始看看Eloquent是何许规划并达成的。

上篇讲到了数码库Relation的完毕,本篇接着讲migrations or database modification logic的成效,此处起头的git是git co aa98553

对应的 belongsTo(卡塔尔国 的用法跟下不熟谙龙活虎对风度翩翩涉及大器晚成致:

其中Relation是基类,然后其它的多少个都连续它。

参考

[ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系

那是orm的第三篇,你的砥砺是自身继续写下去的重力,期望我们同盟进步。

图片 5

本条时代,每一个人都以一流个体!关切本身,一同成年人!

二、中间操作流Builder 这几个单词可以直译成布局器,可是“中间操作流”更便于明白,因为数据库操作大多数时候都以链式操作的。

Many To Many

以user和role为例,二个顾客会有差别的剧中人物,二个剧中人物也可能有差异的人,那时候就需求一张中间表role_user,代码注解上如下:

class User extends Model{ /** * The roles that belong to the user. */ public function roles() { return $this->belongsToMany('AppRole'); }}class Role extends Model{ /** * The users that belong to the role. */ public function users() { return $this->belongsToMany('AppUser'); }}

本条涉及大家有一点具体讲下,大家在应用上恐怕会是底下那标准的

return $this->belongsToMany('AppRole', 'user_roles', 'user_id', 'role_id');

在布局函数中,会调用addConstraints方法,如下

// class belongsToManypublic function addConstraints(){ $this->setSelect()->setJoin()->setWhere();}

此处会预先安装setSelect()->setJoin()->setWhere(),功能分别是:

setSelect(卡塔尔 : 在select的字段中新扩充 role.*,user_role.id as pivot_id

setJoin():新增join, join user_role on role.id = user_role.role_id,联合查询

setWhere():新增 user_id = ?

查询的表是role,join表user_role

在get的时候,其论理和HasOne等关乎也富有不相同,代码如下:

// class belongsToManypublic function get($columns = array{ $models = $this->query->getModels; $this->hydratePivotRelation; if (count > 0) { $models = $this->query->eagerLoadRelations; } return new Collection;}

那边有个措施叫hydratePivotRelation,我们进去看下到底是怎么回事

// class belongsToManyprotected function hydratePivotRelation(array $models){ // 将中间记录取出来,设置属性pivot为Model pivot foreach ($models as $model) { $values = $this->cleanPivotAttributes; $pivot = $this->newExistingPivot; $model->setRelation('pivot', $pivot); }}

实则做的事务正是设置了Role的pivot属性。

到那,大家就深入分析完了eloquent在f6e2170本子上存有的功力了,到方今结束,eloquent的类图如下:

图片 6

日前,我们解析到的版本是f6e2170,已经具有了二个orm该须求的意义了,Connection担任数据库操作,Builder负担面向对象的sql操作,Grammar负责sql的拼装,Eloquent/Model是Active Record形式的宗旨Model,同期具备世界逻辑和数据库操作作用,个中数据库操作功效是寄托给了Eloquent/Builder,同临时间大家也定义了对象的3种关系,1-1,1-N,N-N,下黄金年代阶段,Eloquent将会促成migrations or database modification logic的法力,尽情期望。

这是orm的第二篇,你的砥砺是自家继续写下去的引力,期望大家合营提升。

图片 7其有时代,各类人都是最好个体!关怀自己,一同成长!

数据库蓝图

先起来本文的核心。数据库管理相关的代码都位居Schema目录下, 最开始的布局如下:

src/Illuminate/Database/Schema
├── Blueprint.php
└── Builder.php

就多个公文Blueprint和Builder,Schema/Builder肩负提供数据库操作的面向对象似的操作,而Schema/Blueprint则担当储存具体的操作数据,满含数据库操作的吩咐和数码库表的定义,由此有下边包车型大巴布局:

图片 8

紧接着,我们看看是怎么利用Blueprint的,下看创制table

$grammar = new IlluminateDatabaseSchemaGrammarsMySqlGrammar;
$blueprint = new Blueprint('users');
$blueprint->create();
$blueprint->increments('id');
$blueprint->string('email');
$statements = $blueprint->toSql($grammar);

此刻回去的$statements是一个array,有count($statements)==1,并且$statements[0]为:

create table `users` (`id` int not null auto_increment primary key, `email` varchar(255) not null)

大家前些天来看下上述是怎么贯彻的?

首先构造函数传入表名users,而create则是加了一个命令

public function create()
{
    return $this->addCommand('create');
}

addCommand则是将下令参加进$this->commands中,而下边包车型客车increments函数如下:

public function increments($column)
{
  return $this->integer($column, true);
}
public function integer($column, $autoIncrement = false)
{
  return $this->addColumn('integer', $column, compact('autoIncrement'));
}

其最后是调用了addColumn将其参加进$this->columns中,下边看下toSql函数,其核心是上边包车型客车部分:

foreach ($this->commands as $command)
{
  $method = 'compile'.ucfirst($command->name);

  if (method_exists($grammar, $method))
  {
    if ( ! is_null($sql = $grammar->$method($this, $command)))
    {
      $statements = array_merge($statements, (array) $sql);
    }
  }
}

对此每一个命令,大家都调用grammar的compileCommand函数,此处大家调用的是compileCreate函数,至此大家就解析完了数据库表操作的点子,上面大家来看migrations功能。

. 每二个 Model 中都钦命表名

图片 9

Eloquent ORM

2.意气风发对多关系

图片 10

总结

从v4.0.0发轫,基本Eloquent就曾经定位了,到前段时间风靡master分支上,目录构造也尚无怎么变动了,由此下大器晚成篇最早,大家会在风行版的根底上,解析下Eloquent的一些切实可行的贯彻,尽情期望。

$accounts = User::find->get();

即其实Relation是对EloquentBuilder的贰个卷入,接济面向对象式的sql操作,大家上面来看下当大家采纳HasOne的时候发出了怎么样。

新纪元

为了然决PHP组件管理及散步的标题,二〇〇三年的php|tek大会上确立了PHP-FIG组织,意在通过八个方法来拟订PHP社会群众体育在支付组件时的正规化,laravel重视PHP_FIG的提出,将框架组件独立开荒并取名称叫Illuminate,再提供Starter Package让框架使用者可以因而composer创建项目,因而大家从eloquent-v4.0.0先河,大家会最早看档案的次序laravel/framework。

在4.*本子的时候,laravel/framework还利用的psr-0专门的学问,全部其目录层级依然src/Illuminate/Database,在此个本子中有个新的目录Capsule,其下部是叁个Manager文件,其初期是在f851607中出席的,大家来看下Manager中的内容。

图片 11

此地为何会见世Manager,当项目变复杂后,大家很难轻便的和Eloquent的当中的机件进行有效的功效了,此时供给二个品类的伪装,帮衬我们和外边联系,让外部尽恐怕轻易的采纳Eloquent,于是就应时而生了Manager,记得英特网查找过重要字Using Eloquent outside Laravel,大家能够旁观一篇Vivek Kumar Bansal写的文章,小说从2方面介绍了怎么利用Eloquent

  • Building Schema
  • Making a Model

在这里两个以内,咱们要求有一个先是步便是计划条件,大家来看下代码:

use IlluminateDatabaseCapsuleManager as Capsule;

/**
 * Configure the database and boot Eloquent
 */
$capsule = new Capsule;
$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'host',
    'database'  => 'database',
    'username'  => 'username',
    'password'  => 'password',
    'charset'   => 'utf8',
    'collation' => 'utf8_general_ci',
    'prefix'    => 'prefix_'
]);
$capsule->setAsGlobal();
$capsule->bootEloquent();

建立有3个步骤

  1. 加上数据库连接addConnection
  2. 安装实例全局可访谈setAsGlobal
  3. 启动Eloquent,bootEloquent

上面具体看下每一种步骤做的业务。

第一步addConnection,增加了暗中同意的数据库配置,通过那个布局,大家得以因此DatabaseManager.connection来拿到数据库连接connection,进而实行操作。

第二步setAsGlobal,其动作就做了static::$instance = $this,通过将实例设置为静态变量,大家就会在全局通过静态方法来寻访Capsule了。

第三步bootEloquent,通过Eloquent::setConnectionResolver($this->manager)设置了Model的静态变量$resolver,进而能够利用Model。

经过地点3步运行完后,大家就会最初上面包车型地铁行事了,先看率先个Building Schema,即数据库本人的操作,我们给出示例的代码:

use IlluminateDatabaseCapsuleManager as Capsule;
use IlluminateDatabaseSchemaBlueprint;

//Creating schema
Capsule::schema()->create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('username');
    $table->string('first_name')->nullable();
    $table->string('last_name')->nullable();
    $table->string('email');
    $table->string('password');
    $table->timestamps();
});

//Droping Schema
Capsule::schema()->dropIfExists('users');

其中Capsule::schema()回到的是SchemaBuilder实例,然后进行健康的操作操作,此处Blueprint概念了蓝图,数据库表的概念,然后通过Blueprint.build来推行蓝图,进而爆发多少库表。

进而大家看第1个Making a Model,使用上非常轻易:

//User Model
use IlluminateDatabaseEloquentModel as Eloquent
class User extends Eloquent {
    //
}

此处Eloquent已经通过初步化设置了静态变量$resolver,大家能够方便的拿到连接Connection了,也正是有了数据库操作的作用。

好了,以上就是Capsule/Manager的效果了,也就是Eloquent的外衣,负担照看一切,当时大家再画下首要的类图:

图片 12

地点Capsule是大管家,然后DatabaseManger则是此中执会考查计算局领,管理者两大公司Schema和Query,同不日常间DatabaseManger和Eloquent还管理合作关系,Eloquent负担领域类的收拾,最终ConnectionFactory则照望着富有的Connection,提供底蕴的功用。

在 Model 中使用:

Eloquent首先要对数据库连接做抽象,于是有了Connection类,内部重若是对PDO的多个包装,不过若是只有Connection的话,叁个难点是,大家须求面临sql,于是就有了Builder类,其成效即是遮挡sql,让我们能用面向对象的点子来成功sql的询问效率,Builder相应是sql builder,当时Eloquent的主要的类就疑似下:

图片 13

`first` `paginate` `delete()` 是用的可比多的局地 “终结者” 方法,他们会在中等操作流的最终现身,把 SQL 打给数据库,拿到重返数据,经过加工重临一个 Article 对象或然一堆 阿特icle 对象的集聚。

图片 14Eloquent

这段代码除了出示了生机勃勃对生龙活虎关乎该怎么使用之外,还转达了三点音讯,也是自己对此名门使用 Eloquent 时候的提议:

正文是orm类别的第二篇,也是Eloquent演变的第后生可畏篇,Eloquent体系会尝试着讲清楚Eloquent是怎么着一步一步蜕变到当前作用强大的版本的,然则到底个人力量轻易,不恐怕解析的老大全面,总会有不懂的地点,所以讲的不错误之处,恳请大牌们能建议,或许风姿罗曼蒂克旦你有怎么着地方是没看懂的,也请提出难题来,因为或者那地方就是本身要好没看懂,所以没讲通晓,也请建议来,然后大家协同评论的,让大家能一起的腾飞的。

hasOne('Account', 'user_id', 'id'); }}

One-To-One

User 和 Phone的1对1的关系,

class User extends Model{ /** * Get the phone record associated with the user. */ public function phone() { return $this->hasOne('AppPhone'); }}// 逆向定义class Phone extends Model{ /** * Get the user that owns the phone. */ public function user() { return $this->belongsTo('AppUser'); }}

sql的查询相符于下边

select id from phone where user_id in select id from user where id in (phone.user_id)

. has one account 那样的关系写成 `hasOneAccount`

大家看看当调用Model的hasOne主意后,再次回到是一个HasOne,即Relation,当大家调用Relation的格局时,是怎么管理的吧?通过魔术点子__call,将其委托给了EloquentBuilder

从名称想到所包蕴的意义,那陈诉的是五个模型之间意气风发对风流倜傥的涉及。这种涉及是无需中间表的。

讲到那,大家列举下对象时期的涉及

高级中学级操作流,请看代码:

这时候HasOne的布局函数如下:

public function parent_video(){ return $this->belongsToMany($this, 'video_hierarchy', 'video_id', 'video_parent_id');}public function children_video(){ return $this->belongsToMany($this, 'video_hierarchy', 'video_parent_id', 'video_id');}

里头具体便是在基本功BaseBuilder上通过Model来博取一些音信设置,举例$this->from($model->getTable这种操作,还也许有三个平价是涵养了BaseBuilder的单风流罗曼蒂克,未有变异Model和BaseBuilder之间的双向重视,通过Model同层的Builder来去耦合,如下图所示:

$users = User::with->take

下一步是要引进1-1,1-N,N-N的关联了,能够经过git co 912de03查阅,那个时候贰个大幅度增加的类的状态如下:

使用跟 hasMany 一样:

最终调用match方法,正是不利的给各类model设置好relation关系。

此地最难之处在于前边的多个 foreign_key 和 local_key 的装置,我们能够就此记住:在 User 类中,无论 hasOne 何人,第1个参数都以 `user_id`,第多少个参数一般都以 `id`。由于前面包车型客车 `find` 已经锁定了 id = 10,所以这段函数对应的 SQL 为: `select * from account where user_id=10`。

use IlluminateDatabaseQueryBuilder as BaseBuilder;class Builder extends BaseBuilder { /** * The model being queried. * * @var IlluminateDatabaseEloquentModel */ protected $model; ....}
user: id ... ...pay: id ... ... user_id

先看HasOne,即OneToOne的关系,看代码

多对多涉及和此前的关联完全差别等,因为多对多涉及也许现身众多冗余数据,用事前自带的表存不下了。

if (count > 0){ $models = $this->eagerLoadRelations;}
$builder = Article::where->title;

上述便是大家深入分析的HasOne的兑现,其余的关系都相通,此处不再另行,然后eager load的意思是指,当我们要加载多少个数据的时候,大家尽量用一条sql解决,并非多条sql,具体来说若是大家有两个Users,须要加载Phones的,尽管不选拔eager,在每一个sql就是where user_id=?,而eager方式则是where user_id in,那样差别就很显眼了.

这么生成的 SQL 正是以此样子的:

本文由澳门威利斯人发布于威利斯人娱乐,转载请注明出处:Eloquent演化历程1,Eloquent演化历程2

关键词: 澳门威利斯人 laravel 历程 系列 orm