前言
在過去開發的時候,我在 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 協議》,轉載必須註明作者和本文連結