博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
7. 从数据库获取数据- 从零开始学Laravel
阅读量:5973 次
发布时间:2019-06-19

本文共 7556 字,大约阅读时间需要 25 分钟。

路由,控制器,视图我们都学了一点了,从这里开始,我们先看下如何用migration创建数据表,然后通过查询构建器(query builder)和Elequent去获取数据。

我们以获取所有的博客的帖子为例,先写一条路由:

Route::get('posts', 'PostsController@index');

进入终端生成PostsController控制器类

➜ php artisan make:controller PostsControllerController created successfully.

控制器中PostsController写上index方法

resources/views/下 建立posts/index.balde.php的视图文件,让其继承layout.balde.php.

@extends('layout')@section('content')    

所有的帖子

@stop

开启php artisan serve服务, 浏览器输入 测试我们从路由->控制器->视图 这个流程是能跑通的了。

下面我们先进入到config/database.php文件中,config文件夹内的文件都是一些配置文件,像数据库,缓存,邮件,队列等的配置都在这里,或者你自己以后新建的配置文件也可以放在这个文件夹内。

我们打开database.php,该文件就是返回一个数组:

PDO::FETCH_CLASS, 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ], ], 'migrations' => 'migrations', 'redis' => [ 'cluster' => false, 'default' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ],];

laravel默认支持了以上几种数据库,你希望使用哪种数据库,在'default' => env('DB_CONNECTION', 'mysql'),

将env()的函数的第二个参数设置成为你要使用的,比如说我们现在用sqlite

'default' => env('DB_CONNECTION', 'sqlite'),

上面的sqlite对应的配置文件是:

'sqlite' => [    'driver' => 'sqlite',    'database' => env('DB_DATABASE', database_path('database.sqlite')),    'prefix' => '',],

上面的database_path()是laravel自带的一个帮助函数,意思是获取应用数据库目录的完整路径,如我的是:"/usr/local/var/www/Laravel52/database", ok, 我们在database目录下建立database.sqlite文件

传统方法上,我们可能会用Sequel Pro写出原生的sql语句执行,或者使用mysql workbench建立ER图模型,然后导入到数据库中,这些方法都可以用,但是在多人开发的时候,维护本地的数据库以及当添加了新表或者修改了表字段,变的很麻烦,比如你修改了表的字段,这时候你得告诉你的同事,我修改了哪些字段,而Laravel自带的migration很好的解决了这个问题,migration可以看成是数据库的版本控制,你无论是添加了表,还是修改了字段,你的同事只需要执行php artisan migrate就可以保证他的数据库和你一样了,这对于数据库的线上部署也非常的方便。这个东西刚开始用的时候会有点不习惯,但是如果你一直坚持用下去,你会发现这的确是个好东西,千万不要放弃它。

我们打开database/migrations目录,里面已经存在了两个migration文件,一个是用来创建用户users表的,另一个是用来创建密码重置password_resets表的。我们打开2014_10_12_000000_create_users_table.php这个文件:

increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('users'); }}

上面的文件包含了up()down()两个函数,up()中的内容是创建users表及其字段,而down()函数是删除users表。

我们暂时不用这两个文件,我们先删除它们,然后我们来创建我们的posts表.

我们到项目的根目录执行php artisan, 里面有一个php artisan make:migration的命令,其作用就是创建一个migration文件,如果你想看下这个命令的详细信息和用法,可以执行 php artisan -h make:migration ,我们来试一下,进入终端,执行:

➜ php artisan make:migration create_posts_table --create=posts# 输出下面的信息Created Migration: 2016_11_14_062612_create_posts_table

对于migration文件的命名,通常如果是创建一个表,那么我们可以写create_xxx的复数形式_table,后面跟上--create=表名, 那如果是添加表的一个字段呢,我们可以写add_字段名_to_表名_table,后面跟上指定的表名--table=表名,其实就是写成一句通顺的英文句子,这在团队开发的时候是非常必要的。

再回头打开在database/migrations下创建的2016_11_14_062612_create_posts_table.php文件,主要看up()函数:

public function up()    {        Schema::create('posts', function (Blueprint $table) {            $table->increments('id');            $table->timestamps();        });    }

这里是调用了Schema类的create方法,我们要添加的表字段都会放在这个方法的闭包函数中,比如我们的帖子需要一个字符串类型的标题,那么只要这么写:

$table->string('title');

通过这句代码的字面意思,大家就能够看懂,如果还想添加别的类型,查询下

这里我们还要来看下$table->timestamps();这句话,这句话可以替我们的表自动生成created_atupdated_at字段,并且laravel会自动维护它,比如我们创建一篇帖子,我们不用手动的写明创建时间,laravel会自动的帮我们填上创建时间,这非常有用,除了一些字典表外,别的表我建议大家都可以保留它。

好了,我们在编辑下2016_11_14_062612_create_posts_table.php的up()函数,最终如下:

public function up()    {        Schema::create('posts', function (Blueprint $table) {            $table->increments('id');            $table->string('title');            $table->text('content')->nullable();            $table->timestamps();        });    }

migration文件我们创建好了,下面我们如果将该表生成到数据库中呢,在终端进入项目根目录,执行php artisan migrate即可。

php artisan migrate# 输出下面信息Migration table created successfully.Migrated: 2016_11_14_062612_create_posts_table

注意:现在我们还没有讲到.env文件的使用,大家执行上面的命令前,先把根目录下的.env文件中的下面代码注释掉,用英文的#注释:

# DB_CONNECTION=mysql# DB_HOST=127.0.0.1# DB_PORT=3306# DB_DATABASE=homestead# DB_USERNAME=homestead# DB_PASSWORD=secret

下面我们写一些测试代码看看数据库的使用,对于一些简单的测试代码,我们可以使用php artisan tinker工具,在终端进入这个工具,我们可以直接编写我们的php代码,如:

php artisan tinker

和上面的方法一样,大家用tinker工具,在插入一条数据,然后通过代码DB::table('posts')->get(); 查看我们现在posts表中的所有数据如下:

=> [     {#626       +"id": "1",       +"title": "My New Post Title",       +"content": "new post content",       +"created_at": "2016-11-14 07:22:32",       +"updated_at": "2016-11-14 07:22:32",     },     {#627       +"id": "2",       +"title": "My Second  Post Title",       +"content": "Second post content",       +"created_at": "2016-11-14 07:27:50",       +"updated_at": "2016-11-14 07:27:50",     },

测试没有问题后,我们将上面的代码写到我们的控制器类中去,打开PagesController类,更改下index()函数如下:

get(); return view('posts.index', compact('posts')); }}

下面打开posts/index.balde.php视图文件,修改如下:

@extends('layout')@section('content')    

所有的帖子

@foreach ($posts as $post)

{
{ $post->title }}

{

{ $post->content }}

@endforeach@stop

开启serve, 浏览器 就能正确显示了。

Laravel提供了另一个非常强大的ORM Elequent, 如果是第一次接触Elequent,很多人会去查一下它的意思是什么,查查可以,但是不用去纠结,它就是一个名字而已,就像artisan也就是个名字,我们不用过多的关心它的意思,我们只要知道它能干什么就行了,用的多了,以后听到这个词,你就会知道它是个ORM,会联想到它的一些用法和它的强大。我们先简单的看看这个Elequent, 还在终端,在项目的根目录下,我们执行:

➜ php artisan make:model Post                                 Model created successfully.

注意:模型 Model名一般都是表名的单数形式,比如表名叫posts, Model名则是Post, 表名叫users, 则Model名就是User, 这样写的好处是,Laravel能通过Model名自动找到对应的表名。

我们在app/目录下打开,Post.php文件:

ok, 现在更改下PagesController.php中的代码:

在浏览器在访问下,还是得到相同的输出。是不是代码更清晰了。

我们在来做一个小功能,我们给帖子列表上的每个帖子标题添加一个链接,让其跳转到具体的帖子页面,我们的流程当然还是,路由-》控制器-》视图层

route.php添加一条路由:

Route::get('posts/{post}', 'PostsController@show');

通常我们访问一个帖子的路由一般是:posts/1类似这种,我们上面的{post},接受的其实就是帖子的id, 我们这里为什么写{post},而不写{id}呢? 这个问题先放放,我们接着往下走。

我们然后进入PostsController.php, 编写show()函数,如下:

// 这里的$post变量接受路由{post}传递来的数值    public function show($post)    {        return $post;    }

我们访问:http://localhost:8000/posts/1, 页面返回的数据是1.我们要获取帖子id为1的数据呢,我们再改下show()函数:

public function show($postId)    {        $post = Post::find($postId);        return $post;    }

我们访问:

显示具体帖子页面

上面代码的修改,我们得到了我们想要的数据,不过这样做,代码有点多余,我们写代码在易读的基础上当然是越少越好,Laravel提供了路由模型绑定的功能(其实就是依赖注入),我们再来更改下show()函数:

public function show(Post $post)    {        return $post;    }

我们将$post指名为Post的一个对象,当laravel执行到show()函数时,会自动实例话$post对象,这时候我们返回$post,就可以得到一个具体的对象了。

我们试下:

路由模型绑定

注意:使用上面的路由模型绑定功能,一定要注意路由中的{post}与对应控制器中的$post这两个变量名一定要一模一样,如果你路由中的变量写成{postId}, 而控制器的中对应的变量使用$post, 那么路由模型绑定就不会成功了。

上面的show()函数对应的show.balde.php我们没有写,这个大家自己去补上吧!

转载地址:http://dddox.baihongyu.com/

你可能感兴趣的文章
远程桌面体验注意事项
查看>>
mysqldump常用方法
查看>>
Hibernate3的配置参数汇总
查看>>
表归档脚本脚本
查看>>
Linux 监视用户的使用情况
查看>>
js如何把一个时间戳转换成固定字符串格式的日期
查看>>
九大措施确保VMware View安全
查看>>
Jquery实现图片轮播功能
查看>>
MyEclipse设置自动提示
查看>>
[cocos2dx]COCOS2D-X 关于 fatal error C1083: 无法打开包括文件:“CCStdC.h” 的问题
查看>>
快速掌握一门常用语言的50%
查看>>
误删除根目录
查看>>
你被定制化了吗?
查看>>
InputStreamReader和FileReader的一个区别
查看>>
Log4j 2.x入门
查看>>
检测tomcat假死时重新启动及邮件通知
查看>>
java.math.BigDecimal cannot be cast to java.lang.String ----解决方案
查看>>
ibatis一些使用小记
查看>>
手动创建Web项目
查看>>
vbox share file between guest with host
查看>>