Laravel Eloquent 小技巧
214 2017-04-19
在大型的項目中使用LaravelEloquentORM,某些工作可能會變得重復(fù)和繁瑣,所以本文為大家總結(jié)了5個很少人知道的小技巧,在開發(fā)過程中幫我節(jié)省了很多時間。下面就讓我們開始吧。
1.快速生成Model&Migration
這并不是一個很多人知道的小技巧,在Laravel文檔中也沒有提到。下面我們以一個博客為簡單的例子,為文章生成Model和Migration。
$phpartisanmake:migrationcreate_posts_table
$phpartisanmake:modelPost
大部分人可能會按上面這樣做,其實這兩條命令可以合并為下面這一條:
$phpartisanmake:modelPost-m
2.Eloquent查詢Scopes
還是以前面的博客應(yīng)用為例,假設(shè)我們的文章表有一個is_published字段,其值為0或1(表示False或True)。在博客列表,我們希望用戶只能看到已經(jīng)發(fā)布(published)的文章,使用Eloquent我們?nèi)绾芜^濾掉未發(fā)布的文章呢?答案很明顯,需要在查詢語句中使用where條件:
Post::where('is_published',true)->get();
這當然可以,但如果我們想在其他地方重復(fù)使用這個代碼段呢?這么重復(fù)復(fù)制當然也可以實現(xiàn),但為了符合DRY原則(Don’trepeatyourself),我們可以使用Eloquent的查詢Scope。在Post模型中創(chuàng)建ascopePublished方法:
classPostextendsModel
{
publicfunctionscopePublished($query)
{
return$this->where('is_published',true);
}
}
要獲取已發(fā)布文章,我們只需簡單的調(diào)用如下命令:
Post::published()->get();
Eloquent可以自己把它翻譯為scopePublished方法。Eloquent模型中任何以scope開始是方法都被當做Eloquentscope。
值得注意的是,Eloquentscope的返回值必須是一個查詢生成器的實例,所以在scope中你不能調(diào)用->get()或->paginate()。
3.Accessors(訪問器)
在很多情況下,你可能需要訪問Eloquent模型在數(shù)據(jù)中并不存在,需要經(jīng)過一定計算的屬性,但很抱歉。我們來看一個例子。假設(shè)現(xiàn)在有一個User表,它包含這樣兩個字段:forenames和surname。如果你想在視圖中顯示用戶全名的話,你不得不這么做:
{{$user->forenames.''.$user->surname}}
首先,我們的應(yīng)用中可能有很多地方需要使用這段代碼,一遍又一遍的輸入顯然很不實際。其次,呃,語法非常的丑陋且顯得格格不入。下面我們來看看如何通過訪問器(又稱屬性)使其變得更加整潔一些。我們在User模型中創(chuàng)建一個新的方法:
classUserextendsModel
{
publicfunctiongetNameAttribute()
{
return$this->forenames.''.$this->surname;
}
}
同Eloquent識別scope一樣,任何以get和Attribute包裹起來的方法都會當做Eloquentaccesor(訪問器)。現(xiàn)在我們可以試著執(zhí)行下面的代碼段,它得到的結(jié)果和前面是相同的:
{{$user->name}}
這不僅可以重復(fù)使用,而且更容易輸入,并且更具有可讀性。
4.動態(tài)方法名稱
……缺乏一個很好的術(shù)語。Eloquent對于一些方法特別的聰明,如where()??纯聪旅娴睦樱?/p>
//Post::where('published',1)->get();
Post::wherePublished(1)->get();
//Post::where('category',null)->get();
Post::whereNull('category')->get();
//Post::where('category','!=',null)->get();
Post::whereNotNull('category')->get();
是不是更加的整潔?
5.擴展訪問器
我們來擴展一下#3。有時候,特別是使用API時,當我們使用Eloquent從數(shù)據(jù)庫獲取記錄時,需要對返回的結(jié)果集中添加一些訪問器(或者說屬性)。如果沒看明白的話,看看下面這個例子。當調(diào)用User::find(1)的時候,返回的結(jié)果看起來可能是下面這樣的:
{
id:1,
forenames:"Terry",
surname:"Harvey",
:"contact@terryharvey.co.uk",
created_at:"2016-05-0221:27:58",
updated_at:"2016-05-0318:09:37",
}
這并沒有什么問題,但如果我們想在其中顯示前面創(chuàng)建的name屬性呢?讓我們回到模型中添加$appends屬性:
classUserextendsModel
{
protected$appends=['name'];
}
如果再次執(zhí)行前面的代碼,name屬性被直接添加到了結(jié)果中。
{
id:1,
forenames:"Terry",
surname:"Harvey",
name:"TerryHarvey",
:"contact@terryharvey.co.uk",
created_at:"2016-05-0221:27:58",
updated_at:"2016-05-0318:09:37",
}
掃一掃
獲取更多福利
獵學網(wǎng)企業(yè)微信
獵學網(wǎng)訂閱號
獵學網(wǎng)服務(wù)號