目錄
Laravel的数据库配置
使用Migration
使用Eloquent
all()方法
toArray()方法:
toJson()方法
where()方法
下一节
首頁 後端開發 php教程 Laravel 5系列教程四:数据库和Eloquent

Laravel 5系列教程四:数据库和Eloquent

Jun 20, 2016 pm 12:50 PM

原文来自: https://jellybool.com/post/programming-with-laravel-5-database-and-eloquent-model

上一篇写了一些Laravel Blade的基本用法和给视图传递变量的几种方式,

这一节我们来说说跟数据库打交道的数据库配置和Laravel强大的Eloquent。

Laravel的数据库配置

本部分内容为下节做准备

Laravel的配置文件都是在项目目录的config/文件夹之下,这里也就是在blog/config文件夹之下,你可以打开这个文件夹看看,你面有很多配置文件:如mail.php(配置邮件发送服务的)和database.php(配置数据库的),我们这里就是来看看这个database.php配置文件:

 'connections' => [        'mysql' => [            'driver'    => 'mysql',            'host'      => env('DB_HOST', 'localhost'),            'database'  => env('DB_DATABASE', 'forge'),            'username'  => env('DB_USERNAME', 'forge'),            'password'  => env('DB_PASSWORD', ''),            'charset'   => 'utf8',            'collation' => 'utf8_unicode_ci',            'prefix'    => '',            'strict'    => false,        ]        //...        ]
登入後複製

打开文件,你可以看到里面只是返回简单地php数组而已,我们目前只是关心connections这个数组。上面的代码并没给出所有的数据库配置,你可以自己看,由于博主使用的是mysql,所以这里会给出mysql的配置,其他数据库你可以参照着来,后续的教材博主也会依旧使用mysql。

那这里说到的配置,基本上就是对下面四个变量的配置:

'host'      => env('DB_HOST', 'localhost'),//如果.env文件没有DB_HOST配置,则取localhost,后面的一样'database'  => env('DB_DATABASE', 'forge'),'username'  => env('DB_USERNAME', 'forge'),'password'  => env('DB_PASSWORD', ''),
登入後複製

这里的env()方法是读取到.env (位于blog/.env) 这个文件里面的配置项

打开这个文件,你可以看到一些常用的配置,包括debug模式和开发环境,你也可以看到我们下面这几个需要操作的选项:

DB_HOST=localhostDB_DATABASE=homesteadDB_USERNAME=homesteadDB_PASSWORD=secret
登入後複製

由于这里我使用的是Homestead的开发环境,所以才有了上面的配置(Homestead的默认用户名和密码为homestead和secret),如果你是直接使用php artisan serve这种方式开启服务来开发的话,相应地修改你的配置。

Laravel为什么要采取这样的配置呢?很大的一个原因可能就是考虑到文件的安全性和便捷性,这样我们在需要将代码推送到coding或者Github的时候,我们可以直接ignore这个.env文件,不必担心我们的核心信息呗泄露。在部署应用的时候,我们可以直接在服务器创建一个.env文件,写上对应的配置项就OK了。

就这样,只要我们正确配置信息,我们就连接上数据库了,当然,你得首先创建一个homestead数据库。

使用Migration

连接好数据库之后,我们就需要创建相对应的数据表了,在没有使用Laravel之前,你可能都是直接手动创建数据表的,比如我们这个blog项目,你会到数据库中手动创建一个articles数据表,但是在Laravel的项目中,我极力推荐你使用Migration,这样有什么好处呢?其实你可以将Migration看做一个数据库的版本管理工具,就如git对于我们的项目文件的版本管理,你可以rollback,你可以reset等,它给予你一种代码实现和命令行结合的方式来管理你的数据库,如果你在blog/目录下,命令行执行 php artisan ,你可以看到很多命令行,下面这几个就是我们这里谈到的rollback和reset等:

红色框框这几个基本就是比较常用的,如果这里我还没有说服使用migration,那么我们来将这个过程走一遍:

首先,我们创建一个migration文件,也就是定义一张表的schema,命令行执行:

php artisan make:migration create_articles_table --create='articles'
登入後複製

顺利执行之后,我们会得到一个migration文件,这个文件位于database/migrations/下面,打开这个文件夹,你可以看到Laravel本来就有两个migration文件,users表和password-reset表,我们在这个项目中目前还不用这两个文件。所以可以直接删掉,然后打开我们刚刚生成的migration文件:create_articles_table这个文件

 public function up()    {        Schema::create('articles', function (Blueprint $table) {            $table->increments('id');            $table->timestamps();        });    }    /**     * Reverse the migrations.     *     * @return void     */    public function down()    {        Schema::drop('articles');    }
登入後複製

这里有两个方法:up()和down()。up()方法是执行php artisan migrate的时候调用的,这个方法会创建一个articles数据表,而down()方法则是在php artisan migrate:rollback的使用执行的,这里会直接删除articles这个数据表。

但是,这里先不要急着执行php artisan migrate,我们还需要为articles的增加几个字段:

public function up()    {        Schema::create('articles', function (Blueprint $table) {            $table->increments('id');// 主键 自增            $table->string('title');            $table->text('intro');            $table->text('content');            $table->timestamp('published_at');            $table->timestamps(); // 自动创建的两个字段:created_at 和 updated_at        });    }
登入後複製

这里我们的intro字段是文章的简介,published_at字段是文章的发表日期,这样做对我们写博客有很大的好处,你可以将博客的发表日期控制起来,因为有一些我写好的但是还没有到发表日期的,还不想让用户看到的文章我就可以用published_at来控制了。这样之后,我们来执行一下php artisan migrate:

然后,articles这个表就创建成功了。

这个时候你可能还没有体会到migration的好处,想象下面两个场景:

1. 在进行团队开发的时候,团队成员将我们的代码pull下来之后,怎么可以拿到一样的数据库表设计呢?难道要我们将表 export 出来,给每一个成员import一次?这显然不够明智,如果使用的migration,就一行命令,直接`php artisan migrate`,就可以拿到一样的数据库表了。2. 如果这个时候我们发现articles这个表的有一个字段写错了,比如我们的intro字段写错,它应该命名为introduction的,这个时候,我们怎么办?直接手动改数据库的表?那么回到第一个场景,你的团队成员也需要手动改?这显然也不是我们喜欢的方式,这个时候,migration的优势就来了
登入後複製

比如我们这里演示一下怎么解决第二个场景:

我们只需要命令行执行:

php artisan migrate:rollback
登入後複製

然后修改up()方法的intro字段:

$table->text('introduction');
登入後複製

然后再执行php artisan migrate:

大工告成,更多特性请看文档:

http://laravel.com/docs/5.1/migrations

使用Eloquent

上面我们创建好了articles数据表之后,我们就可以为这个表写一个Model类了,你可以手动创建,也可以使用artisan命令行来创建一个model,比如你在命令行敲php artisan,你会看到make下面会有很多命令,而make:model就是我们需要使用的命令:

就像解释的一样:Create a new Eloquent model class

很多时候,在Laravel中,我们在创建一个model的时候都会有一些约定俗成的命名方法:

如果说我们有一个articles数据表,我们的model相对应就命名为Article;如果说我们有一个users的数据表,我们的model对应就命名为User;
登入後複製

就是基本上遵守数据表复数而model单数大写就可以了。

所以根据这个规律我们来创建我们的Article Model,使用的是make:model命令:

php artisan make:model Article 
登入後複製

这样一来,我们的Article Model就创建成功了,这个文件位于blog/app/Article.php,打开之,可以看到我们Laravel为我们生成的内容:

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Article extends Model{    //}
登入後複製

注意到Article这个类是继承与我们的Eloquent\Model 类,由于这个Eloquent\Model类实现了很多非常棒的方法供我们使用,我们可以来愉快地玩耍了。

首先开始玩耍的是,使用 php artisan tinker这个工具来play around,tinker提供了一个Eloquent跟数据库表交互的命令行界面,你可以在上面写一些简单地php操作,比如:

所以,我们来实例化一个Article吧:

$article = new App\Article
登入後複製

这样就相当于我们实例化了一个Article类了,我们可以在后面的操作中进行字段具体化。

在上面我们创建表的时候,我们有以下几个字段:

$table->increments('id');$table->string('title');$table->text('intro');$table->text('content');$table->timestamp('published_at');$table->timestamps();
登入後複製

于是我们可以用tinker来设置以下上面的$article的各个字段,就如设置属性一样简单。

比如设置$article的title可以这样:

$article->title = 'Router Views Controllers';
登入後複製

同理,我们也可以将intro和content字段设置:

$article->intro = 'Article 1 Intro';$article->content = 'Article 1 Content';
登入後複製

不过这里需要注意的是published_at这个字段,这里我推荐使用一个很棒的时间处理库Carbon,因为像created_at和 updated_at这两个字段也是使用的Carbon类,这样在后面的处理中,我们会有很多好处,这里我们先直接使用Carbon:

$article->published_at = Carbon\Carbon::now();
登入後複製

而对于$table->timestamps()这个,Laravel会在我们插入数据的时候自动完成的,所以这里我们每个字段都赋值完毕之后,我们可以使用Eloquent的save()方法来向数据库的articles表插入一条数据了:

$article->save();
登入後複製

返回一个true的时候,表示我们成功插入数据了,我们来看看数据库:

以上,就是一个简单而完整的使用tinker给Eloquent赋值的玩耍过程。

下面我们再来玩耍一会:

all()方法

all()方法会返回Article的所有记录:

$articles = App\Article::all();
登入後複製

find(),接受一个参数$id,比如查找id为1的一条记录:

$article = App\Article::find(1);
登入後複製
登入後複製

你也可以传入一个$id的数组,查找多条记录,不过这里我们只有一条数据,所以就这样了。不过我们也可以这样玩玩:

toArray()方法:

将一个Eloquent的对象转为数组:

$article = App\Article::find(1)->toArray();
登入後複製

toJson()方法

将一个Eloquent的对象转为json字串:

$article = App\Article::find(1)->toJson();
登入後複製

如果就简简单单这样的话,Eloquent也不能算很强大,我们在写代码过程中的where语句呢,这个也没有么?

不用担心,这个马上就有:

where()方法

$article = App\Article::where('title','=','Router Views Controllers')->get();
登入後複製

在使用where()的时候,往往需要用get()来获取记录集,这个返回的是一个Eloquent\Collection结果集,但是如果我就是想要满足条件的第一天记录呢,不需要结果集呢?

使用first()方法,在上面的基础上,get()换成first():

$article = App\Article::where('title','=','Router Views Controllers')->first();
登入後複製

到这里,一些简单地查找工作就可以告一段落了,而对于update呢,我们可以这样:

$article = App\Article::find(1);$article->intro = 'Article 1 Intro Update!';$article->save();
登入後複製

我们来看看有没有更新:

$article = App\Article::find(1);
登入後複製
登入後複製

也可以使用update()方法:

$article->update(['content'=>'Article 1 Content Update']);
登入後複製

正常情况下我们会得到一个MassAssignmentException with message:

文档看这里: http://laravel.com/docs/5.1/eloquent#mass-assignment

这个是因为Eloquent默认是不允许我们直接更新我们的数据的,这是出于可能出现数据覆盖的情况,但是如果我们确实是先要实现这样的功能,我们可以在Article这个model文件里面加一个$fillable数组:

class Article extends Model{    protected $fillable = ['content'];}
登入後複製

然后再执行一次看看:

这里需要Ctrl + C 退出tinker在重新进来一次。

查找,更新之后,借着我们在聊到MassAssignment这个概念的时候,我们可以来聊聊create()这个方法了,这个方法可以在不用声明new Article()的情况下创建一条数据,比如:

 App\Article::create(['title'=>'Article 2','intro'=>'intro 2','content'=>'Article 2 content','published_at'=>Carbon\Carbon::now()]);
登入後複製

然后我们会看到一个奇怪的现象,我们并没有得到我们想要的结果:

我们只有content这个字段正确有了值,title,intro,published_at都没有值,这是为什么了?其实也是因为MassAssignment的缘故,我们可以参照content的时候,在Article里面的$fillable设置我们的可以填充的字段:

class Article extends Model{    protected $fillable = [        'title',        'intro',        'content',        'published_at'    ];}
登入後複製

然后再执行一次:

成功创建了一条数据,然后我们发现第二条其实并不是我们想要的,我们来删除它:

使用delete()方法:

$article = App\Article::find(2);$article->delete();
登入後複製

我们用all()来检查一下:

这里也可以使用destroy(),这个方法可以接受一个$id或者一个数组$ids:

App\Article::destroy(3);
登入後複製

最后还是放一下官方文档:http://laravel.com/docs/5.1/eloquent

下一节

到这里基本的Eloquent也就介绍到这里了,鉴于这一节说了Model,前面也都接触过Views和Controllers,下一节打算说说Model Views Controllers的基本流程。

Happy Hacking

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1669
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

您如何防止PHP中的SQL注入? (準備的陳述,PDO) 您如何防止PHP中的SQL注入? (準備的陳述,PDO) Apr 15, 2025 am 12:15 AM

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

See all articles