使用 Laravel Eloquent 構造器讓模型更簡潔

laradocs發表於2021-10-06

前言

在過去開發的時候,我在 Laravel 中建立了大量的模型。這些模型總是會隨著大量的增加而膨脹。例如:

app/Models/Article.php

.
.
.
class Article extends Model
{
    use HasFactory;

    public function scopePublished ( Builder $builder )
    {
        return $builder->whereNotNull ( 'published_at' );
    }
}

// 使用 scope
Article::published()->get();

可以想象,這些方法在一段時間後可能會導致模型膨脹。

編寫自己的 Eloquent 構造器

要整理上面的模型,我們可以自己建立一個 Eloquent 構造器並繫結在模型上。我們結合上面的示例,編寫自己的構造器:

app/Builders/ArticleBuilder.php

<?php

declare ( strict_types=1 );

namespace App\Builders;

use Illuminate\Database\Eloquent\Builder;

class ArticleBuilder extends Builder
{
    public function published()
    {
        return $this->whereNotNull ( 'published_at' );
    }
}

繫結自己的 Eloquent 構造器

現在可以把我們自定義的查詢構造器繫結到 Article 模型,可以通過覆蓋 newEloquentBuilder 方法來完成:

app/Models/Article.php

.
.
.
use App\Builders\ArticleBuilder;

class Article extends Model
{
    use HasFactory;

    public function newEloquentBuilder ( $query )
    {
        return new ArticleBuilder ( $query );
    }
}

使用自己的 Eloquent 構造器

使用方法和上面一樣,直接呼叫即可:

Article::published()->get();

最後,在功能方面沒有任何改變的情況下,您的模型變得更加清晰。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
站在巨人的肩上

相關文章