Recca Chao 的 gitHub page

推廣網站開發,包含 Laravel 和 Kotlin 後端撰寫、自動化測試、讀書心得等。Taiwan Kotlin User Group 管理員。

View on GitHub

Eloquent ORM Where

更短的「whereHas」

雖然 Laravel 的 whereHas 非常適合根據指定的關聯以及其他查詢限制來擷取記錄,但有一個名為「whereRelation」的捷徑可以完成相同的任務 🚀

<?php

// 之前
User::whereHas('comments', function ($query) {
    $query->where('created_at', '>', now()->subDay());
})->get();

// 之後
User::whereRelation('comments', 'created_at', '>', now()->subDay())->get();

動態 Wheres

您知道 Laravel 允許您定義動態「where」條件嗎?例如,您可以執行 whereNameAndAge(name_value, age_value) 🤯

請務必將方法名稱新增至模型的 PHPDoc 中,這樣您的 IDE 就不會抱怨,這對它來說有點太神奇了,無法理解。

想知道它是如何完成的嗎?請查看 Illuminate\Database\Query\Builder::dynamicWhere()

<?php

// select * from `users` where `name` = 'oussama' and `last_name` = 'mater"
User::whereNameAndLastName('oussama', 'mater')->first();

「whereBelongsTo」方法

您知道 Laravel 附帶「whereBelongsTo」來取得父模型嗎?這將使程式碼更具可讀性 🚀

<?php

// 這個
$posts = Post::where('user_id', $user->id)->get();
// 或這個可以
$posts = Post::whereUserId($user->id)->get();

// 但這個更具可讀性
$posts = Post::whereBelongsTo($user)->get();

「whereAll」和「whereAny」方法

Laravel v10.47.0 包含四個新方法:「whereAll」、「whereAny」、「orWhereAll」和「orWhereAny」。這些方法可讓您將一個值與多個欄位進行比較 🚀

<?php

$search = 'ous%';

// 而不是這樣
User::query()
    ->where(function($query) use ($search) {
        $query
            ->where('first_name', 'LIKE', $search)
            ->where('last_name', 'LIKE', 'ous%');
    })
    ->get();

// 您現在可以這樣做
User::query()
    ->whereAll(['first_name', 'last_name'], 'LIKE', $search)
    ->get();

User::query()
    ->whereAny(['first_name', 'last_name'], 'LIKE', $search)
    ->get();

// 這會產生下列查詢

// select * from `users` where (`first_name` LIKE 'ous%' and `last_name` LIKE 'ous%')
// select * from `users` where (`first_name` LIKE 'ous%' or `last_name` LIKE 'ous%')

// 您也可以使用「orWhereAll」和「orWhereAny」。

「whereKey」方法

您知道 Laravel 附帶「whereKey」方法嗎?它讓您的「where in」陳述式更具可讀性,而且,您不必記住主鍵的名稱 🚀

<?php

// 😕 而不是這樣做
Post::whereIn('id', [1,2,3])->get();
Post::whereNotIn('id', [1,2,3])->get();

// 😎 您可以這樣做
Post::whereKey([1,2,3])->get();
Post::whereKeyNot([1,2,3])->get();

使用高階「orWhere」方法

Laravel 支援集合的「高階訊息」,這是我們使用的很酷的捷徑。但是您知道您可以在撰寫 eloquent 查詢時使用它們嗎?🚀

<?php

// 而不是這樣 😫
User::popular()->orWhere(function (Builder $query) {
    $query->active();
})->get()

// 您可以這樣做 😎
User::popular()->orWhere->active()->get();

使用「whereIntegerInRaw」加快查詢速度

在使用非使用者輸入的 whereIn 查詢時,可以選擇 whereIntegerInRaw。這會透過跳過 PDO 綁定和 Laravel 的 SQL 注入防護措施,來加快您的查詢速度 🚀

<?php

// 而不是使用 whereIn()
Product::whereIn('id', range(1, 10000))->get();

// 使用 WhereIntegerInRaw()
Product::whereIntegerInRaw('id', range(1, 10000))->get();

「firstWhere」方法

我們經常需要取得符合 where 陳述式的第一筆記錄。雖然「where()」結合「first()」可以完成工作,但 Laravel 附帶一個捷徑「firstWhere()」來完全做到這一點 🚀

<?php

// 而不是這樣 😞
$user = User::query()->where('name', 'john')->first();

// 這樣做 😎
$user = User::query()->firstWhere('name', 'john');

「whereLike」方法

我們經常在應用程式中使用「where like」陳述式。您知道 Laravel 附帶一個「whereLike」方法,它更進一步,允許 like 陳述式不區分大小寫嗎?🚀

<?php
// 而不是這樣
User::query()->where('name', 'like', 'Jo%')->get();

// 您可以這樣做
User::query()->whereLike('name', 'Jo%')->get();

// 您甚至可以指定是否應區分大小寫
User::query()->whereLike('name', 'Jo%', caseSensitive: true)->get();
// 查詢:select * from `users` where `name` like binary 'Jo%'

「withWhereHas」方法

您是否曾經需要預先載入一個關聯,但同時又要用關聯存在性來限制它?雖然您可以使用 2 個方法手動執行此操作,但 Laravel 附帶「withWhereHas」方法來完全做到這一點 🚀

// 而不是這樣
User::query()
    ->whereHas('posts', fn (Builder $query) => $query->where('featured', true))
    ->with(['posts' => fn (Builder $query) => $query->where('featured', true)])
    ->get();

// 您可以簡單地使用 withWhereHas 🔥
User::query()
    ->withWhereHas('posts', fn (Builder $query) => $query->where('featured', true))
    ->get();

// 這將擷取所有符合條件的使用者,以及僅其精選貼文。