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

資訊專欄INFORMATION COLUMN

Laravel 5系列教程八:queryScope 和 setAttribute

FreeZinG / 2966人閱讀

摘要:注意在文件頭部使用來引入。比如我們想使用這個(gè)方法,就定義為??偨Y(jié)又是最后的結(jié)尾了,這里我們簡單的介紹了和的用法,下一節(jié)打算說說的一個(gè)重要的內(nèi)容。那個(gè)時(shí)候也就會(huì)越來越覺得的強(qiáng)大了。

原文來自 https://laravist.com/article/16

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

Laravist是我剛剛上線的Laravel社區(qū),有任何與Laravel相關(guān)的問題可以到這里來問我,我會(huì)盡力去幫大家解決問題,后期會(huì)嘗試錄制一些視頻教程,形式大概是這樣的

https://laravist.com/lesson/1

直接就是按照上一節(jié)所說的那樣,我們來說說queryScope和setAttribute在laravel的用法。

關(guān)于應(yīng)用場景

這里我首先是想向大家簡單說說這兩個(gè)知識(shí)點(diǎn)得應(yīng)用場景是什么,我們?cè)陂_發(fā)的時(shí)候,總是希望有一種偷懶的方式,所以考慮以下這兩個(gè)場景:

數(shù)據(jù)在存入數(shù)據(jù)庫的時(shí)候需要進(jìn)行預(yù)先處理,比如考慮一個(gè)簡單地例子:我們?cè)诒4嬗脩舻牡卿浢艽a的時(shí)候,都是需要將密碼用某種方式加密過后在寫入數(shù)據(jù)庫的,我們難道在每一次在提交表單過來之后都對(duì)傳過來的數(shù)據(jù)進(jìn)行一次數(shù)據(jù)加密么?能不能有一種自動(dòng)完成對(duì)密碼入庫前就加密的機(jī)制呢?這樣我們?cè)谔幚肀韱蔚臅r(shí)候就不用關(guān)心密碼加密的問題了

想一想我們?cè)谙蛴脩粽故镜臄?shù)據(jù)是不是基本上都是從數(shù)據(jù)庫取的呢?那么往往我們會(huì)有很多的查詢語句,在這樣的情況之下很多的查詢語句可以就會(huì)重復(fù),但是在寫代碼這一行中,一旦出現(xiàn)多個(gè)重復(fù),基本上就會(huì)有優(yōu)化方式存在,所以這個(gè)時(shí)候queryScope就派上用場了

setAttributes

之前,我們都是將published_at設(shè)置為文章創(chuàng)建的日期:

$input["published_at"] = Carbon::now();

然而這并不是我們想要的,我們希望有一種可以控制的方式,比如在表單之中設(shè)置文章的發(fā)布日期,所以,我們來實(shí)現(xiàn)一下:首先將published_at這個(gè)字段放到我們的form之中,在create.blade.php中,加入published_at 輸入框輸入:

{!! Form::label("published_at","發(fā)布日期") !!} {!! Form::input("date","published_at",date("Y-m-d"),["class"=>"form-control"]) !!}

這一段代碼加在textarea后面,這里使用了Form::input(),這個(gè)方法,因?yàn)镕orm這個(gè)類沒有類似Form::date()指定date的方法,所以我們使用Form::input()并指定input的類型為date,并使用date("Y-m-d")來指定默認(rèn)值為文章發(fā)布當(dāng)天,但是我們可以修改,我們來看看我們的頁面現(xiàn)在是什么樣的:

這里我們可以看到我們拿到了published_at這個(gè)字段了,這個(gè)時(shí)候,可以修改一下ArticleController中的store()方法的代碼了:

$input = $request->all();
$input["intro"] = mb_substr($request->get("content"),0,64);
Article::create($input);
return redirect("/");

我們刪除了$input["published_at"] = Carbon::now();這一行代碼,然后嘗試創(chuàng)建一篇文章來看看:

OK,到這里,文章可以創(chuàng)建成功了,但是如果我們看看數(shù)據(jù)庫當(dāng)中的數(shù)據(jù):

這里的日期設(shè)置成的格式并不是理想的模式,有沒有一種方式可以將其設(shè)置為跟created_atupdated_at一樣的呢?時(shí)分秒都可以知道的呢?這個(gè)時(shí)候就可以使用setAttribute來完成了,在Article.php中添加下面的方法:

public function setPublishedAtAttribute($date)
{
    $this->attributes["published_at"] = Carbon::createFromFormat("Y-m-d",$date);
}

這里注意這個(gè)寫法set+字段名+Attribute,還有的就是使用駝峰法。比如你要加密密碼的時(shí)候可以這樣:

public function setPasswordAttribute($passowrd)
{
    $this->attributes["password"] = Hash::make($passowrd);
    //僅僅是舉例
}

這里我們使用了Carbon這個(gè)類,因?yàn)槲覀冞€想將published_at字段作為Carbon對(duì)象來處理,這樣后期會(huì)有很大的好處。注意在文件頭部使用use CarbonCarbon;來引入Carbon。這個(gè)時(shí)候我們?cè)賮戆l(fā)表一次:

再來看看數(shù)據(jù)庫:

這樣一來格式是對(duì)了,那么再來為Article.php添加一行代碼使published_at作為Carbon對(duì)象來處理:

protected $dates = ["published_at"];

對(duì)這樣就完成了,關(guān)于更多地Carbon好處和使用特性,我們?cè)诤竺嬖僬f。

queryScope

上面實(shí)現(xiàn)了用published_at實(shí)現(xiàn)了文章的發(fā)布日期,但是現(xiàn)在的文章展示還是原來的樣式,這并不是我們想要的結(jié)果,因?yàn)槲覀儎倓傇O(shè)置發(fā)表日期為9-12的文章(寫文章的時(shí)候?yàn)?b>9-08)也展示出來了,我們得限制一下。首先我們可以在查詢的時(shí)候直接實(shí)現(xiàn),比如在ArticleControllerindex()方法中將查詢語句寫成這樣:

$articles = Article::where("published_at","<=",Carbon::now())->latest()->get();

我們使用where()直接限制published_at時(shí)間小于或等于當(dāng)前時(shí)間的文章才進(jìn)行顯示,看看效果:

發(fā)現(xiàn)在未來時(shí)間發(fā)布的文章確實(shí)隱藏了,這樣貌似已經(jīng)達(dá)到了目的,為什么還要引入qeuryScope這個(gè)用法呢?這是因?yàn)榭紤]到代碼的重用性,比如我們要是多個(gè)地方使用到Article::where("published_at","<=",Carbon::now())這個(gè)條件限制呢,我們有沒有一種方式可以將查詢語句寫成類似下面這種形式呢?

$articles = Article::latest()->published()->get();

就是直接使用published()這個(gè)自定義的方法來代替where("published_at","<=",Carbon::now())呢,這樣代碼可讀性也會(huì)更好。

所以我們就來說說,queryScope的用法了,想想我們之前設(shè)置published_at這個(gè)字段的目的:

我們希望可以對(duì)文章進(jìn)行簡單地管理,比如我們?cè)趯懴盗形恼碌臅r(shí)候,有可能一天寫了好幾篇,但是這種時(shí)候其實(shí)我們發(fā)一篇文章就好了,每天消化一篇文章就很不錯(cuò)了,所以作為作者,我并不想還沒到發(fā)布日期的文章就展示給用戶看,但是,我寫了文章也想把它存入數(shù)據(jù)庫,讓它在該發(fā)布的日期自動(dòng)顯示,這樣就好了。于是,我們可以好好利用一下published_at這個(gè)字段

在我們的Article.php中增加下面的方法:

public function scopePublished($query)
{
    $query->where("published_at","<=",Carbon::now());
}

這里注意一下寫法scope+自定義的方法名字,還有就是一如既往的駝峰法。比如我們想使用published()這個(gè)方法,就定義為scopePublished($query)。這個(gè)時(shí)候就可以真正的使用上面說的查詢了,在ArticleControllerindex()方法中:

$articles = Article::latest()->published()->get();

再去看看效果,相信你刷新之后還是一樣的。

總結(jié)

又是最后的結(jié)尾了,這里我們簡單的介紹了queryScope和setAttribute的用法,下一節(jié)打算說說Eloquent的一個(gè)重要的內(nèi)容:Eloquent Relationship。那個(gè)時(shí)候也就會(huì)越來越覺得laravel的強(qiáng)大了。

最后:Happy Hacking

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

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

相關(guān)文章

  • Laravel 5系列教程七:表單驗(yàn)證 Validation

    摘要:幾乎在每一個(gè)應(yīng)用當(dāng)中都會(huì)有表單,而有表單基本就離不開表單驗(yàn)證。在中,其實(shí)可以說是有兩種方式來進(jìn)行表單驗(yàn)證使用和使用。然后,上面的驗(yàn)證規(guī)則是對(duì)于和兩個(gè)字段,我們需要用戶為其填充內(nèi)容,不能為空。 原文來自:https://laravist.com/article/15 免費(fèi)視頻教程地址 https://laravist.com/series/laravel-5-basic Laravis...

    jindong 評(píng)論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 評(píng)論0 收藏0
  • Laravel 5 系列入門教程(四)【最適合中國人的 Laravel 教程】【完結(jié)】

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

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

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

    未東興 評(píng)論0 收藏0
  • Laravel 5 系列入門教程(三)【最適合中國人的 Laravel 教程

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

    xcold 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<