成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel 5系列教程四:數(shù)據(jù)庫和Eloquent

XFLY / 3228人閱讀

摘要:原文來自免費(fèi)視頻教程地址上一篇寫了一些的基本用法和給視圖傳遞變量的幾種方式,這一節(jié)我們來說說跟數(shù)據(jù)庫打交道的數(shù)據(jù)庫配置和強(qiáng)大的。

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

免費(fèi)視頻教程地址 https://laravist.com/series/laravel-5-basic

上一篇寫了一些Laravel Blade的基本用法和給視圖傳遞變量的幾種方式,

這一節(jié)我們來說說跟數(shù)據(jù)庫打交道的數(shù)據(jù)庫配置和Laravel強(qiáng)大的Eloquent。

Laravel的數(shù)據(jù)庫配置

本部分內(nèi)容為下節(jié)做準(zhǔn)備

Laravel的配置文件都是在項(xiàng)目目錄的config/文件夾之下,這里也就是在blog/config文件夾之下,你可以打開這個(gè)文件夾看看,你面有很多配置文件:如mail.php(配置郵件發(fā)送服務(wù)的)database.php(配置數(shù)據(jù)庫的),我們這里就是來看看這個(gè)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數(shù)組而已,我們目前只是關(guān)心connections這個(gè)數(shù)組。上面的代碼并沒給出所有的數(shù)據(jù)庫配置,你可以自己看,由于博主使用的是mysql,所以這里會給出mysql的配置,其他數(shù)據(jù)庫你可以參照著來,后續(xù)的教材博主也會依舊使用mysql。

那這里說到的配置,基本上就是對下面四個(gè)變量的配置:

"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) 這個(gè)文件里面的配置項(xiàng)

打開這個(gè)文件,你可以看到一些常用的配置,包括debug模式和開發(fā)環(huán)境,你也可以看到我們下面這幾個(gè)需要操作的選項(xiàng):

DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

由于這里我使用的是Homestead的開發(fā)環(huán)境,所以才有了上面的配置(Homestead的默認(rèn)用戶名和密碼為homestead和secret),如果你是直接使用php artisan serve這種方式開啟服務(wù)來開發(fā)的話,相應(yīng)地修改你的配置。

Laravel為什么要采取這樣的配置呢?很大的一個(gè)原因可能就是考慮到文件的安全性和便捷性,這樣我們在需要將代碼推送到coding或者Github的時(shí)候,我們可以直接ignore這個(gè).env文件,不必?fù)?dān)心我們的核心信息唄泄露。在部署應(yīng)用的時(shí)候,我們可以直接在服務(wù)器創(chuàng)建一個(gè).env文件,寫上對應(yīng)的配置項(xiàng)就OK了。

就這樣,只要我們正確配置信息,我們就連接上數(shù)據(jù)庫了,當(dāng)然,你得首先創(chuàng)建一個(gè)homestead數(shù)據(jù)庫。

使用Migration

連接好數(shù)據(jù)庫之后,我們就需要?jiǎng)?chuàng)建相對應(yīng)的數(shù)據(jù)表了,在沒有使用Laravel之前,你可能都是直接手動創(chuàng)建數(shù)據(jù)表的,比如我們這個(gè)blog項(xiàng)目,你會到數(shù)據(jù)庫中手動創(chuàng)建一個(gè)articles數(shù)據(jù)表,但是在Laravel的項(xiàng)目中,我極力推薦你使用Migration,這樣有什么好處呢?其實(shí)你可以將Migration看做一個(gè)數(shù)據(jù)庫的版本管理工具,就如git對于我們的項(xiàng)目文件的版本管理,你可以rollback,你可以reset等,它給予你一種代碼實(shí)現(xiàn)和命令行結(jié)合的方式來管理你的數(shù)據(jù)庫,如果你在blog/目錄下,命令行執(zhí)行 php artisan ,你可以看到很多命令行,下面這幾個(gè)就是我們這里談到的rollbackreset等:

紅色框框這幾個(gè)基本就是比較常用的,如果這里我還沒有說服使用migration,那么我們來將這個(gè)過程走一遍:

首先,我們創(chuàng)建一個(gè)migration文件,也就是定義一張表的schema,命令行執(zhí)行:

php artisan make:migration create_articles_table --create=articles

在win下開發(fā)的同學(xué)請無視截圖的 --create="articles" 感謝 @狂魔邪子 的指正,這里的 --create 參數(shù)指定的表不用引號

順利執(zhí)行之后,我們會得到一個(gè)migration文件,這個(gè)文件位于database/migrations/下面,打開這個(gè)文件夾,你可以看到Laravel本來就有兩個(gè)migration文件,users表和password-reset表,我們在這個(gè)項(xiàng)目中目前還不用這兩個(gè)文件。所以可以直接刪掉,然后打開我們剛剛生成的migration文件:create_articles_table這個(gè)文件

 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");
    }

這里有兩個(gè)方法:up()down()。up()方法是執(zhí)行php artisan migrate的時(shí)候調(diào)用的,這個(gè)方法會創(chuàng)建一個(gè)articles數(shù)據(jù)表,而down()方法則是在php artisan migrate:rollback的使用執(zhí)行的,這里會直接刪除articles這個(gè)數(shù)據(jù)表。

但是,這里先不要急著執(zhí)行php artisan migrate,我們還需要為articles的增加幾個(gè)字段:

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(); // 自動創(chuàng)建的兩個(gè)字段:created_at 和 updated_at
        });
    }

這里我們的intro字段是文章的簡介,published_at字段是文章的發(fā)表日期,這樣做對我們寫博客有很大的好處,你可以將博客的發(fā)表日期控制起來,因?yàn)橛幸恍┪覍懞玫牡沁€沒有到發(fā)表日期的,還不想讓用戶看到的文章我就可以用published_at來控制了。這樣之后,我們來執(zhí)行一下php artisan migrate

然后,articles這個(gè)表就創(chuàng)建成功了。

這個(gè)時(shí)候你可能還沒有體會到migration的好處,想象下面兩個(gè)場景:

在進(jìn)行團(tuán)隊(duì)開發(fā)的時(shí)候,團(tuán)隊(duì)成員將我們的代碼pull下來之后,怎么可以拿到一樣的數(shù)據(jù)庫表設(shè)計(jì)呢?難道要我們將表 export 出來,給每一個(gè)成員import一次?這顯然不夠明智,如果使用的migration,就一行命令,直接php artisan migrate,就可以拿到一樣的數(shù)據(jù)庫表了。

如果這個(gè)時(shí)候我們發(fā)現(xiàn)articles這個(gè)表的有一個(gè)字段寫錯(cuò)了,比如我們的intro字段寫錯(cuò),它應(yīng)該命名為introduction的,這個(gè)時(shí)候,我們怎么辦?直接手動改數(shù)據(jù)庫的表?那么回到第一個(gè)場景,你的團(tuán)隊(duì)成員也需要手動改?這顯然也不是我們喜歡的方式,這個(gè)時(shí)候,migration的優(yōu)勢就來了

比如我們這里演示一下怎么解決第二個(gè)場景:

我們只需要命令行執(zhí)行:

php artisan migrate:rollback

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

$table->text("introduction");

然后再執(zhí)行php artisan migrate

大工告成,更多特性請看文檔:

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

使用Eloquent

上面我們創(chuàng)建好了articles數(shù)據(jù)表之后,我們就可以為這個(gè)表寫一個(gè)Model類了,你可以手動創(chuàng)建,也可以使用artisan命令行來創(chuàng)建一個(gè)model,比如你在命令行敲php artisan,你會看到make下面會有很多命令,而make:model就是我們需要使用的命令:

就像解釋的一樣:Create a new Eloquent model class

很多時(shí)候,在Laravel中,我們在創(chuàng)建一個(gè)model的時(shí)候都會有一些約定俗成的命名方法:

如果說我們有一個(gè)articles數(shù)據(jù)表,我們的model相對應(yīng)就命名為Article;

如果說我們有一個(gè)users的數(shù)據(jù)表,我們的model對應(yīng)就命名為User;

就是基本上遵守數(shù)據(jù)表復(fù)數(shù)而model單數(shù)大寫就可以了。

所以根據(jù)這個(gè)規(guī)律我們來創(chuàng)建我們的Article Model,使用的是make:model命令:

php artisan make:model Article
 

這樣一來,我們的Article Model就創(chuàng)建成功了,這個(gè)文件位于blog/app/Article.php,打開之,可以看到我們Laravel為我們生成的內(nèi)容:


注意到Article這個(gè)類是繼承與我們的EloquentModel 類,由于這個(gè)EloquentModel類實(shí)現(xiàn)了很多非常棒的方法供我們使用,我們可以來愉快地玩耍了。

首先開始玩耍的是,使用 php artisan tinker這個(gè)工具來play around,tinker提供了一個(gè)Eloquent跟數(shù)據(jù)庫表交互的命令行界面,你可以在上面寫一些簡單地php操作,比如:

所以,我們來實(shí)例化一個(gè)Article吧:

$article = new AppArticle

這樣就相當(dāng)于我們實(shí)例化了一個(gè)Article類了,我們可以在后面的操作中進(jìn)行字段具體化。

在上面我們創(chuàng)建表的時(shí)候,我們有以下幾個(gè)字段:

$table->increments("id");
$table->string("title");
$table->text("intro");
$table->text("content");
$table->timestamp("published_at");
$table->timestamps();

于是我們可以用tinker來設(shè)置以下上面的$article的各個(gè)字段,就如設(shè)置屬性一樣簡單。

比如設(shè)置$articletitle可以這樣:

$article->title = "Router Views Controllers";

同理,我們也可以將introcontent字段設(shè)置:

$article->intro = "Article 1 Intro";
$article->content = "Article 1 Content";

不過這里需要注意的是published_at這個(gè)字段,這里我推薦使用一個(gè)很棒的時(shí)間處理庫Carbon,因?yàn)橄?b>created_at和 updated_at這兩個(gè)字段也是使用的Carbon類,這樣在后面的處理中,我們會有很多好處,這里我們先直接使用Carbon:

$article->published_at = CarbonCarbon::now();

而對于$table->timestamps()這個(gè),Laravel會在我們插入數(shù)據(jù)的時(shí)候自動完成的,所以這里我們每個(gè)字段都賦值完畢之后,我們可以使用Eloquentsave()方法來向數(shù)據(jù)庫的articles表插入一條數(shù)據(jù)了:

$article->save();

返回一個(gè)true的時(shí)候,表示我們成功插入數(shù)據(jù)了,我們來看看數(shù)據(jù)庫:

以上,就是一個(gè)簡單而完整的使用tinker給Eloquent賦值的玩耍過程。

下面我們再來玩耍一會:

all()方法

all()方法會返回Article的所有記錄:

$articles = AppArticle::all();

find(),接受一個(gè)參數(shù)$id,比如查找id為1的一條記錄:

$article = AppArticle::find(1);

你也可以傳入一個(gè)$id的數(shù)組,查找多條記錄,不過這里我們只有一條數(shù)據(jù),所以就這樣了。不過我們也可以這樣玩玩:

toArray()方法:

將一個(gè)Eloquent的對象轉(zhuǎn)為數(shù)組:

$article = AppArticle::find(1)->toArray();

toJson()方法

將一個(gè)Eloquent的對象轉(zhuǎn)為json字串:

$article = AppArticle::find(1)->toJson();

如果就簡簡單單這樣的話,Eloquent也不能算很強(qiáng)大,我們在寫代碼過程中的where語句呢,這個(gè)也沒有么?

不用擔(dān)心,這個(gè)馬上就有:

where()方法
$article = AppArticle::where("title","=","Router Views Controllers")->get();

在使用where()的時(shí)候,往往需要用get()來獲取記錄集,這個(gè)返回的是一個(gè)EloquentCollection結(jié)果集,但是如果我就是想要滿足條件的第一天記錄呢,不需要結(jié)果集呢?

使用first()方法,在上面的基礎(chǔ)上,get()換成first()

$article = AppArticle::where("title","=","Router Views Controllers")->first();

到這里,一些簡單地查找工作就可以告一段落了,而對于update呢,我們可以這樣:

$article = AppArticle::find(1);
$article->intro = "Article 1 Intro Update!";
$article->save();

我們來看看有沒有更新:

$article = AppArticle::find(1);

也可以使用update()方法:

$article->update(["content"=>"Article 1 Content Update"]);

正常情況下我們會得到一個(gè)MassAssignmentException with message

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

這個(gè)是因?yàn)镋loquent默認(rèn)是不允許我們直接更新我們的數(shù)據(jù)的,這是出于可能出現(xiàn)數(shù)據(jù)覆蓋的情況,但是如果我們確實(shí)是先要實(shí)現(xiàn)這樣的功能,我們可以在Article這個(gè)model文件里面加一個(gè)$fillable數(shù)組:

class Article extends Model
{
    protected $fillable = ["content"];
}

然后再執(zhí)行一次看看:

這里需要Ctrl + C 退出tinker在重新進(jìn)來一次。

查找,更新之后,借著我們在聊到MassAssignment這個(gè)概念的時(shí)候,我們可以來聊聊create()這個(gè)方法了,這個(gè)方法可以在不用聲明new Article()的情況下創(chuàng)建一條數(shù)據(jù),比如:

 AppArticle::create(["title"=>"Article 2","intro"=>"intro 2","content"=>"Article 2 content","published_at"=>CarbonCarbon::now()]);

然后我們會看到一個(gè)奇怪的現(xiàn)象,我們并沒有得到我們想要的結(jié)果:

我們只有content這個(gè)字段正確有了值,title,intro,published_at都沒有值,這是為什么了?其實(shí)也是因?yàn)?b>MassAssignment的緣故,我們可以參照content的時(shí)候,在Article里面的$fillable設(shè)置我們的可以填充的字段:

class Article extends Model
{
    protected $fillable = [
        "title",
        "intro",
        "content",
        "published_at"
    ];
}

然后再執(zhí)行一次:

成功創(chuàng)建了一條數(shù)據(jù),然后我們發(fā)現(xiàn)第二條其實(shí)并不是我們想要的,我們來刪除它:

使用delete()方法:

$article = AppArticle::find(2);
$article->delete();

我們用all()來檢查一下:

這里也可以使用destroy(),這個(gè)方法可以接受一個(gè)$id或者一個(gè)數(shù)組$ids:

AppArticle::destroy(3);

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

下一節(jié)

到這里基本的Eloquent也就介紹到這里了,鑒于這一節(jié)說了Model,前面也都接觸過Views和Controllers,下一節(jié)打算說說Model Views Controllers的基本流程。

Happy Hacking

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21073.html

相關(guān)文章

  • Laravel 5 系列入門教程)【最適合中國人的 Laravel 教程】【完結(jié)】

    摘要:原文發(fā)表在我的個(gè)人網(wǎng)站系列入門教程四最適合中國人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。 原文發(fā)表在我的個(gè)人網(wǎng)站:Laravel 5 系列入門教程(四)【最適合中國人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大家在任何地方卡住,最快捷...

    jsummer 評論0 收藏0
  • Laravel 5 系列入門教程(一)【最適合中國人的 Laravel 教程

    摘要:原文發(fā)表在我的個(gè)人網(wǎng)站系列入門教程一最適合中國人的教程本教程示例代碼見大家在任何地方卡住,最快捷的解決方式就是去看我的示例代碼。在此我推薦一個(gè)全量中國鏡像。 原文發(fā)表在我的個(gè)人網(wǎng)站:Laravel 5 系列入門教程(一)【最適合中國人的 Laravel 教程】 本教程示例代碼見:https://github.com/johnlui/Learn-Laravel-5 大...

    EscapedDog 評論0 收藏0
  • 深入理解 Laravel Eloquent(一)——基本概念及用法

    摘要:原文發(fā)表在我的個(gè)人網(wǎng)站深入理解一基本概念及用法在本系列文章中,我將跟大家一起學(xué)習(xí)的基本用法,探索的各種高級功能,理解背后的運(yùn)行原理,并最終達(dá)到深入理解靈活使用的目的。下一步深入理解二中間操作流 原文發(fā)表在我的個(gè)人網(wǎng)站:深入理解 Laravel Eloquent(一)——基本概念及用法 在本系列文章中,我將跟大家一起學(xué)習(xí) Eloquent 的基本用法,探索 Eloquent 的各種...

    Edison 評論0 收藏0
  • Laravel 5系列教程九:Eloquent Relationship

    摘要:至于一對一和一對多這兩種關(guān)系,可以觸類旁通。注意文件的下載或來源,請自行獲取。接下來,我們使用取得文章的標(biāo)簽,這個(gè)就是我們聲明多對多關(guān)系的方法。 原文來自 https://laravist.com/article/18 免費(fèi)視頻教程地址 https://laravist.com/series/laravel-5-basic Laravist是我剛剛上線的Laravel社區(qū),有任何與L...

    haobowd 評論0 收藏0
  • 利用 Composer 一步一步構(gòu)建自己的 PHP 框架()——使用 ORM

    摘要:引入了命名空間,這是規(guī)劃在中的功能,所以在一定程度上其實(shí)就是,的下一個(gè)版本是,即將發(fā)布,主要貢獻(xiàn)者是大名鼎鼎的鳥哥。使用修改為自動載入路由配置新增注意替換數(shù)據(jù)庫密碼修改無需改動。作者接受采訪時(shí)曾表示,是整個(gè)中最難實(shí)現(xiàn)的部分。 原文發(fā)表在我的個(gè)人網(wǎng)站:利用 Composer 一步一步構(gòu)建自己的 PHP 框架(四)——使用 ORM 本教程示例代碼見 https://github.com...

    FreeZinG 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<