lucaterribili / laravel-add-select

v0.1.5 2022-02-17 15:58 UTC

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 模型 BookChapter,其中一本书可以有多个章节。

通过使用 AddSubSelects 特性,您现在可以通过遵循 add{NewColumnName}Select 命名约定将子查询添加到 Book 模型。例如,以下代码段将两个新的子查询添加到 last_chapter_idlatest_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'];
}