前言提前祝猿们国庆快乐,吃好喝好玩好,电视看你们。按照单一职责开发的原则,在laravel的开发过程中,每个表都要建立一个对外服务和调用的模型。类似这个命名空间App\Models;使用Illuminate\Database\Eloquent\Model;classUserextendsModel{protected$table='users';}解析Laravel的数据操作分为两个DBfacadeEloquentORM它们各有特点,基本的数据操作都是通过Illuminate\Database\Query\Builder的调用方法来完成的完成整个SQL。您还可以使用Builder类作为整个SQL操作的基类。这个类涵盖了下面的操作方法(部分展示)方法publicfunctionselect($columns=['*'])publicfunctionselectSub($query,$as)publicfunctionselectRaw($expression,array$bindings=[])公共函数fromSub($query,$as)公共函数fromRaw($expression,$bindings=[])公共函数addSelect($column)公共函数distinct()公共函数from($table)公共函数join($table,$首先,$operator=null,$second=null,$type='inner',$where=false)publicfunctionjoinWhere($table,$first,$operator,$second,$type='inner')publicfunctionjoinSub($query,$as,$first,$operator=null,$second=null,$type='inner',$where=false)publicfunctionleftJoin($table,$first,$operator=null,$second=null)公共函数where($column,$operator=null,$value=null,$boolean='and')publicfunctionorWhere($column,$operator=null,$value=null)publicfunctionwhereRaw($sql,$bindings=[],$boolean='and')公共函数whereIn($column,$values,$boolean='and',$not=false)publicfunctionorWhereIn($column,$values)可以看出还有很多方法在laravel中文官网或者官方没有体现文档,所以即使你想精通一个框架,也不可能不看它的源代码。这个文件在你的项目目录下vendor/laravel/framework/src/Illuminate/Database/Query下,你可以自己查看。DBfacade通常情况下,你可能会写这样的操作DB::table('user')->get();这个操作首先通过laravel的门面指向文件,但是它不在app.php中,而是通过内核直接加载的,注册在Illuminate\Foundation\Application->registerCoreContainerAliases()中。facade直接调用Illuminate\Database\DatabaseManager类。publicfunctionregisterCoreContainerAliases(){foreach([...'encrypter'=>[\Illuminate\Encryption\Encrypter::class,\Illuminate\Contracts\Encryption\Encrypter::class],'db'=>[\Illuminate\Database\DatabaseManager::class],'db.connection'=>[\Illuminate\Database\Connection::class,\Illuminate\Database\ConnectionInterface::class],'events'=>[\Illuminate\Events\Dispatcher::class,\Illuminate\Contracts\Events\Dispatcher::class],'files'=>[\Illuminate\Filesystem\Filesystem::class],....)}Illuminate\Database\DatabaseManager代码不多,主要处理数据库链接。当你使用DB::table()时,会通过publicfunction__call($method,$parameters){return$this->connection()->$method(...$parameters);}转发,调用就是Illuminate\Database\Connection,用户处理table()方法,然后通过table()方法指向Illuminate\Database\Query类。这个类我们一开始就讲过了,这里就不多说了,接下来就是各种sql的拼接->执行sql->结束战斗EloquentORMELoquentORM类似于DB门面,首先,每个EloquentORM都需要继承父类Illuminate\Database\Eloquent\Model你可能写成User::find(1)父类不存在这个方法,会通过publicstaticfunction__callStatic($method,$parameters){return(newstatic)->$method(...$parameters);}.类似地,User::get()是通过publicfunction__call($method,$parameters){if(in_array($method,['increment','decrement'])){return$this->$method(...$参数);}return$this->newQuery()->$method(...$parameters);}调用,这个方法最后以newBuilder()结束,publicfunctionnewEloquentBuilder($query){returnnewBuilder($query);}最后,我们到达了Illuminate\Database\Eloquent\Builder文件。本课程涵盖了ORM的基本操作,如find、findOrFail等。如果你在代码中使用了get方法,抱歉,这里没有,它还是会通过__call方法$this->query->{$method}(...$参数);至此,整个数据操作已经完成。感谢您阅读到这里,希望本文能对您有所帮助,谢谢
