溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Laravel Eloquent使用技巧有哪些

發(fā)布時間:2022-11-16 09:06:46 來源:億速云 閱讀:95 作者:iii 欄目:編程語言

這篇“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;

在model里面增加自定義值

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'];

為不存在列增加一個變異器(屬性設(shè)置器)

變異器與獲取器相反。你可以用它做些很有意思的事情。 舉個例子,轉(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é)果映射到正確的字段上。

渴求式加載: with $with

讓我們來談?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文檔或深入核心。

modelKeys 方法

有的時候需要查詢所有的主鍵 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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI