Laravel使用总结(一)

写在前面的话:入职快半个月了,趟了许多坑。就这些天遇到的各类问题总结了一些Laravel 中一些小技巧。希望对大家有帮助,同时也方便以后查阅。

1.数据库查询

怎么统计一篇文章有多少评论?最快的方法是:

$article = Article::where(<span class="hljs-string" style="color: rgb(221, 17, 68);">'id'</span>,<span class="hljs-number" style="color: teal;">1</span>)->withCount(<span class="hljs-string" style="color: rgb(221, 17, 68);">'comments'</span>)->first();这样$article变量就有一个属性comments_count了:

$post->comments_count;但是工作中可能会有这样以这个场景:获取点赞数大于的666的评论个数怎么办?这样:

``` $article = Article::where('id',1)->withCount('comments',function($query){ $query->where('like', '>', 666); })->first();

```2.多态关联

文章可以有评论,页面可以有评论,评论也可以有评论,但是总不能建三张评论表吧?如果自己写条件判断也太麻烦了吧。。。Laravel的多态关联上场了!!这个地方的原理与JAVA中的多态类似。

``` //1.第一步在Comment模型中说明我是可以多态的 public function commentable() { return $this->morphTo(); }

//2.在想要评论的模型中增加comments方法, public function comments() { return $this->morphMany(Comment::class, 'commentable'); }

//3.使用,就像普通的一对多关系一样,有点像JAVA中的的运行时绑定: $model->comments; ```原理很简单,comments表中增加两个列就行:

Schema::create(<span class="hljs-string" style="color: rgb(221, 17, 68);">'comments'</span>, <span class="hljs-function"><span class="hljs-keyword" style="font-weight: 700;">function</span> <span class="hljs-params">(Blueprint $table)</span> </span>{ ***************省略******************* $table->morphs(<span class="hljs-string" style="color: rgb(221, 17, 68);">'commentable'</span>); <span class="hljs-comment" style="color: rgb(153, 153, 136);">//等价于</span> $table->integer(<span class="hljs-string" style="color: rgb(221, 17, 68);">'commentable_id'</span>)->index(); $table->string(<span class="hljs-string" style="color: rgb(221, 17, 68);">'commentable_type'</span>)->index(); ****************省略****************** });然后 laravel 会自动维持这些关系。注意,保存的评论的时候是有小技巧的,你的表单中至少要传两个参数:commentable_idcommentable_type

``` $comment = new Comment();

$commentableid = $request->get('commentableid'); //commentabletype取值例如:App\Post,App\Page等等,也可以在 AppServiceProvider 中的 boot 函数中使用 Relation::morphMap 方法注册「多态映射表」,或者使用一个独立的服务提供者注册。 $commentable = app($request->get('commentabletype'))->where('id', $commentable_id)->firstOrFail();

****************省略******************

$commentable->comments()->save($comment); ```保存评论的时候并不知道是谁的评论,而是使用容器根据commentable_type生成一个模型实例,这样也就和具体的模型解耦了,你可以让任何东西可以评论,而不需要修改代码,有点像面向对象设计原则中的OCP(开放-封闭原则 )。

3.查看Laravel中SQL执行日志

刚入门Laravel深深被它优雅的语法所吸引,卧槽。。还有这种操作。的确Laravel的语法确实很优雅,可以提高编程人员前期的开发效率。但是相信每一个优秀的码农都应该对自己的编写的代码的执行过程了如指掌。废话不多说切入正题。

引用一下Laravel5.5文档中写到: “Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库进行交互。每个数据库表都有一个对应的「模型」可用来跟数据表进行交互。你可以通过模型查询数据表内的数据,以及将记录添加到数据表中。”

不可否认这种将Model封装的思想确实非常流行。但是对于负责的业务逻辑或者关联了很多表的操作还是会产生性能问题。因为涉及网络I/O,证书验证等等,数据库连接是非常昂贵的资源。有些查询我们可以在数据库字段冗余上解决,但是这里不做相关介绍。我们可能会遇到这样一个需求查看SQL执行日志,但是Laravel的日志默认是关闭的。下面提供几种方法:

(1)手动查看查询语句

``` //注意引入命名空间 use Illuminate\Suuport\Facades\DB

****************省略******************

DB::enableQueryLog();

// 获取已执行的查询数组 $images = Image::orderBy('id', 'desc')->paginate(24);

dd( DB::getQueryLog() ); //打印sql语句

****************省略****************** ```运行结果如下:

1111.jpg

每次查看sql执行语句都要手动添加许多代码,对代码的入侵性很强。有可能哥们手一抖在查看完sql语句之后忘记注释调试代码,然后提交到线上去了。顿时心中万马奔腾。下面采用另外一种方法。

(2)使用全局中间件

  • 创建中间件:

``` php artisan make:middleware BeforeMiddleware

php artisan make:middleware AfterMiddleware ```- 添加代码:

``` **********下面是BeforeMiddleware中的关键方法*************

public function handle()($request, Closure $next) {     DB:enableQueryLog();     return $next($request); }

**********下面是AfterMiddleware中的关键方法************* public function handle()($request, Closure $next) {     $response = $next($request);     $queries = DB:getQueryLog();     dd($queries);     return $response; }

```- 注册中间件

``` //在app/Kernel中$middlewareGroups>'web'添加如下两行:

\App\Http\Middleware\BeforeMiddleware::class, \App\Http\Middleware\AfterMiddleware::class,

```#### 当不需要查看日志时直接注释即可。

(3)使用Laravel的调试工具Debug Bar

文档介绍的很详细>>>>传送门

(4)使用Laravel的监听器

暂时不做说明,之后单独写一篇博客。

4.Composer中Update与Install

Install命令会优先根据lock文件中的版本去解决依赖,而不会去做更新检查或者去取json中的版本号,这样可以让每个开发者都能得到相同依赖版本。update命令会检查更新同时更新lock文件里的版本号。

5.数据迁移文件字段CRUD

人们对需求的理解一直在变化。需求与业务最直接的体现就是数据库表间关系。项目初期可能只考虑基础模块,随着项目不断的迭代,修改数据库字段是无法避免的事情,但是又要考虑到这样一个问题:不能影响之前已经存在的数据。

数据库中有一个migrations表,记录了数据库迁移文件的执行记录,由系统自动维护。

22222222222222.jpg

migration:数据库迁移文件的名字。batch:迁移文件的版本号。

首先根据具体操作创建一个数据库迁移文件,比如我要向用户表中加入name属性,可以这样写

php artisan make:migration add_name_to_users_table

然后根据具体场景在对应的数据库迁移文件up方法下进行下面的操作:

(1)修改字段属性

Schema::table('users', function ($table) { $table->string('name', 50)->change(); });<br></br>(2)修改字段名

Schema::table('users', function ($table) { $table->renameColumn('from', 'to'); });<br></br>(3)删除字段

Schema::table('users', function ($table) { $table->dropColumn('votes');     //下面是一次性删除多个     $table->dropColumn(['votes', 'avatar', 'location']); });<br></br>(4)增加字段

Schema::table('users', function ($table) { $table->string('name', 50); });最后不要忘了修改原来的数据库迁移文件。

end,欢迎大家斧正。

#

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容