一如既往,它取決於您的項目和用戶在其中扮演的角色。
但基本上,不,我不認爲構建報告的邏輯屬於用戶模型。雖然它可能與用戶有關,但對於SOLID原則,User類應該只有一個責任,在這種情況下是處理User實體。
這包含獲取和設置實例的屬性,在一個簡單的項目中,在模型上定義一些範圍可能也很好,例如,僅選擇活動用戶,例如User::getActive();
但隨着項目的增長,您應該考慮使用更具體的類。例如,您可以將Eloquent功能抽象爲User-Repository。所以,現在你有對entitiy本身操作的處理程序,像
$userRepo->getAll();
$userRepo->getActive();
$userRepo->getInactive();
,併爲用戶實例的句柄:
$user->getName();
$user->setStatus();
創建報表和統計又是一個完全不同的主題。所以,你可以有一些像UserReportBuilder
奧德UserStatisticsService
:
$userStats->getMostActive();
$userStats->getRegistrationsPerDay();
一個簡單的例子:
// UserRepository:
class UserRepository
{
protected $model = $model;
public function __construct($model)
{
// you pass in an instance of the actual Eloquent model
// so you have the whole power of eloquent in here
$this->model = $model;
}
public function getActive()
{
// this returns a collection of models
return $this->model->where('status', 'active')->get();
}
}
$userRepo = new UserRepo(new User);
而這幾乎是它。你仍然可以使用Eloquent,但是你已經將部分功能與清晰的責任分開。所以,你的UserStats類將僅適用於構建用戶的統計數據是resposible:
class UserStats
{
// You could pass in the Repository through the constructor
// or just use the Eloquent model directly
public function getRegistrationsPerDay()
{
return User::groupBy('day')->get(
[
DB::raw('DATE(created_at) as day'),
DB::raw('count(*) as registration_count')
]
);
}
}
用戶實例或UserStats建設者不需要知道如何獲取所有用戶,和用戶實例或UserRepository不需要知道如何計算每天的註冊數量,因此將該功能分成獨立的,獨立的部分是完全合理的。
我想你明白了,我希望它有道理。也許你應該讓自己更熟悉SOLID-principles,並試着在遇到類似問題時記住它們。
我在這種情況下使用存儲庫。存儲庫在構造函數中獲取User模型的一個實例。然後,我只與UserRepository一起工作,而不直接與User一起工作。 – Dave
你在你的倉庫中有sql查詢,對吧? –