您好,登錄后才能下訂單哦!
這篇“Laravel Eloquent使用技巧有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Laravel Eloquent使用技巧有哪些”文章吧。
蛇形命名屬性是一個有趣的屬性。讓我們看看代碼是怎么說的:
/**
* 指示是否在數(shù)組上使用蛇形大小寫屬性。
*
* @var bool
*/
public static $snakeAttributes = true;
人們經(jīng)常會錯誤地使用這個屬性來更改訪問屬性的方式。許多人認(rèn)為,如果更改這個屬性,就可以使用駝峰式注釋輕松訪問屬性。事實并非如此。我們強烈建議你不要使用它。當(dāng)模型作為數(shù)組輸出時,只需定義屬性是駝峰式還是蛇形即可。
如果你想基于駝峰式命名,我們建議你查看 Kirk Bushell 的軟件包 Eloquence by Kirk Bushell.
如果你正在使用 Laravel 的 Eloquent ORM,那這對你是個好消息。 它提供了一種開箱即用的分頁方法。你可能很熟悉這樣的寫法:
$comments = Comment::paginate(20);
使用此方法,你可以每頁20個條目來為 comment model 分頁。更改該值可以定義每頁顯示多少條數(shù)。如果不指定任何內(nèi)容,則應(yīng)用默認(rèn)值,即15。
假設(shè)您希望在網(wǎng)站上的多個位置顯示評論。每頁總是有30條評論。如果必須在每個地方傳遞參數(shù)30,那就麻煩了。因此,您可以直接在模型上設(shè)置新的默認(rèn)值。
protected $perPage = 30;
Eloquent有一個稱為“訪問器”的強大功能。該功能允許你向模型或表中不存在的模型添加自定義字段。使用現(xiàn)有的值或定義全新的值都不重要,隨時都可以回退。下面是訪問器如何工作的示例。假設(shè)有一個名為user
的模型,我們給他添加一個FullName的訪問器:
function getFullNameAttribute() {
return sprintf('%s %s', $this->first_name, $this->last_name);
}
現(xiàn)在你可以訪問post模型上的full_name
屬性,如下:
User::latest()->first()->full_name;
如果返回對象(如集合),則此屬性不會附加到用戶模型。將protected$appends
屬性添加到模型中。它接受一個數(shù)組,其中包含一個或多個字段,從現(xiàn)在起應(yīng)該自動追加這些字段。寫成這樣就可以了:
protected $appends = ['full_name'];
變異器與獲取器相反。你可以用它做些很有意思的事情。 舉個例子,轉(zhuǎn)換不同類型的輸入。 讓我來給你詳細(xì)說說。假設(shè)你想要保存一種類型的時間段。通常,你總是保存盡可能小的單位。在我們的案例中是秒。由于UX的原因,用戶不想輸入秒,例如在一個地方輸入分鐘,或者在另一個地方輸入小時。這一切都可以很快解決。
class Video extends Model
{
public function setDurationInMinutes($value)
{
$this->attributes['duration_in_seconds'] = $value * 60;
}
public function setDurationInHours($value)
{
$this->attributes['duration_in_seconds'] = $value * 60 * 60;
}
}
上述代碼意味著你可以使用一個不存在于數(shù)據(jù)表本身的字段。
model中使用的是duration_in_minutes
字段,但是在后臺,我們使用duration_in_seconds
進(jìn)行更新,也有可能使用一個不存在字段duration_in_hours
。根據(jù)這個邏輯,我們在Controller如此調(diào)用:
class AnyController
{
public function store()
{
$video->update([
'title' => request('title'),
'duration_in_minutes' => request('duration_in_minutes'),
]);
}
}
這將節(jié)省你在控制器中進(jìn)行計算的時間,你可以簡單地使用不存在的列,并在執(zhí)行某些計算時使用變異器
將其結(jié)果映射到正確的字段上。
讓我們來談?wù)勱P(guān)聯(lián)關(guān)系。默認(rèn)情況下,Laravel使用延遲加載。就關(guān)聯(lián)關(guān)系而言,這意味著什么?延遲加載的好處是可以節(jié)省內(nèi)存,因為并不是所有的數(shù)據(jù)都需要保留,我們可以在需要的時候加載數(shù)據(jù)。如下:
$comments = Comment::all();
foreach ($comments as $comment) {
echo $comment->user->name;
}
在上面的例子中,我們會獲取所有評論數(shù)據(jù)。然后遍歷評論并顯示每個評論的用戶名。這段代碼沒什么問題,可以正常工作,但我們遇到了一個問題。延遲加載現(xiàn)在確保僅當(dāng)我們想要輸出用戶名時才執(zhí)行獲取用戶的查詢。
歡迎來到你的第一個 N+1 問題。為什么是 N+1?N 始終是評論的數(shù)量,1 是獲取評論的查詢。例如,如果我們有500個評論,那么獲取所有評論的查詢被觸發(fā)一次,然后一個查詢獲得相應(yīng)的user-per評論。所以500+1查詢。這意味著隨著注釋數(shù)量的增加,查詢的數(shù)量也會增加。
為了防止出現(xiàn)這種情況,有一種稱為渴求式加載的方法。
$comments = Comment::with('user')->get();
foreach ($comments as $comment) {
echo $comment->user->name;
}
這會以兩個查詢結(jié)束。第一個查詢獲取所有注釋,第二個查詢立即獲取所有關(guān)聯(lián)用戶。在后臺,會發(fā)生以下情況(簡化版SQL):
SELECT id, user_id, body FROM comments;
SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);
不論是 10、500 還是 10000 條評論數(shù)據(jù)都不重要,我們都依舊只執(zhí)行兩次SQL查詢。
好了,你現(xiàn)在已經(jīng)看到如何使用渴求式加載了。但只限于如何手動使用。你還可以將整個過程自動化,以便某些關(guān)聯(lián)關(guān)系總是自動通過渴求式方式加載。為此,需要給模型設(shè)定一個屬性。
protected $with = [];
我們可以在Comment
model簡單設(shè)置 protected $with = ['user'];
, 從現(xiàn)在起,user
在任何時候都會自動加載。
我們還有很多種渴求式加載,有僅加載特定列、嵌套即時加載、多個即時加載等等。更多詳情請Laravel文檔或深入核心。
有的時候需要查詢所有的主鍵 ID, 查詢是否復(fù)雜并不重要,大多數(shù)人可能會像這樣做:
User::all()->pluck('id');
這個操作很 nice,但是返回的是一個集合,想要轉(zhuǎn)換成數(shù)組的話可以使用 toArray()
。
User::all()->pluck('id')->toArray();
大多數(shù)情況下,上面的操作的可以簡化成這樣:
User::all()->modelKeys();
這種方式返回一個數(shù)組。重要的是這個方法并不會總是返回 id
。 顧名思義,他是以數(shù)組的形式返回所有模型主鍵。主鍵默認(rèn)是id
,同時也可以在模型中定義主鍵名。
protected $primaryKey = 'id';
以上就是關(guān)于“Laravel Eloquent使用技巧有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。