lucaterribili / laravel-add-select
v0.1.5
2022-02-17 15:58 UTC
Requires
- illuminate/support: ^5.8|^6.0|^7.0|^8.0|^9.0
Requires (Dev)
- orchestra/testbench: ^5.0
This package is auto-updated.
Last update: 2024-09-17 21:50:58 UTC
README
🧱 使用动态方法将子查询添加到您的 Laravel 模型。
如果您不熟悉子查询,我强烈推荐阅读 Johnathan Reinink 的这篇文章:在 Laravel 中使用子查询实现动态关系。
安装
composer require lucaterribili/laravel-add-select
使用方法
考虑两个 Eloquent 模型 Book 和 Chapter,其中一本书可以有多个章节。
通过使用 AddSubSelects 特性,您现在可以通过遵循 add{NewColumnName}Select 命名约定将子查询添加到 Book 模型。例如,以下代码段将两个新的子查询添加到 last_chapter_id 和 latest_version 列。
class Book extends Model { use AddSubSelects; public function addLastChapterIdSelect() { return Chapter::select('id') ->whereColumn('book_id', 'books.id') ->latest(); } public function addLatestVersionSelect() { return Chapter::select('version') ->whereColumn('book_id', 'books.id') ->orderByDesc('version'); } }
现在,您可以使用 withSelect 方法预加载这些子查询。
Book::withSelect('last_chapter_id', 'latest_version')->get();
您还可以使用 loadSelect 方法预加载已经存在于内存中的模型。请注意,此方法将一次性执行所有提供的子查询数据库查询。
$book->loadSelect('last_chapter_id', 'latest_version');
如果您在模型中未预加载这些子查询,您仍然可以将其作为属性访问。第一次访问时,将触发新的数据库查询,但后续访问时,它们将可在模型属性中找到。
$book->last_chapter_id; $book->latest_version;
最后,您可以通过在 Eloquent 模型上设置 withSelect 属性来全局预加载这些子查询。
class Book extends Model { use AddSubSelects; public $withSelect = ['last_chapter_id', 'latest_version']; }